I have a Node.js server hosted in Azure
Developers should be able to write JavaScript satisfying an API and upload it to my MongoDB hosted somewhere else.
My Node.js server now gets triggered and picks the right logic from the MongoDB.
How can I execute this Code dynamically the best way?
Use Eval? Or can I load the file in MainMemory and execute it?
The loaded code must be able to access other methods running on the Server (the ones documented in the API for the developer)
Basically, you are right, we can leverage eval() to execute the javascript code from string, if you need to access to the local scope. You can refer to https://nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_options for the detailed explanation.
Here is my test file in MongoDB:
{
"id": "123",
"code": "someFuc()"
}
And test code snippet in Node.js:
function someFuc(){
console.log("this is consoled from node.js application");
}
...
// file results query from db
...
var code = results[0].code;
console.log(code);
eval(code);
I found a pretty neat solution:
transform the JavaScript syntax to "Node.js" syntax
write the module with the fs-library to a file
"require" the created file to a variable
execute the logic of the variable
delete the file afterwards
--> you can now debug the code unlike with using "eval"
Related
I have some pure JS code and HTML and CSS on my localhost:8000 server. I have installed node.js and I am able to use it without problem testing it on the VS code terminal. However, I want to integrate the file reading mechanic of node.js into the code that I am running on the localhost:8000 server. I want to put this node.js code into my webpage on localhost:8000
const {readFileSync, promises: fsPromises} = require('fs');
function syncReadFile(filename) {
const contents = readFileSync(filename, 'utf-8');
const arr = contents.split(/\r?\n/);
console.log(arr); // 👉️ ['One', 'Two', 'Three', 'Four']
return arr;
}
syncReadFile('./locations.txt');
I have tried copy and pasting it into the js file for the webpage, however when I run it, the console says
Uncaught ReferenceError: require is not defined
at window.onload (index.js:23:46)
index.js:23:46 is the line where const {readFileSync, promises: fsPromises} = require('fs'); is.
How do I fix this?
I think you need a better understanding of how NodeJS works:
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
A JavaScript runtime is (in this context) a program that runs in a machine, with tools to interact with that machine. In development, the context of that machine is the context of a Server.
Now, JavaScript found it's use in the HTML script tag, that's the most "vanilla" way to execute JS in it's home, what it's most used for. In this context, JavaScript is running as a Client.
What makes NodeJS, different from executing the same code in an HTML file you can already execute without installing NodeJS?
It's as vanilla as you can get after you "force" JavaScript to be executed in the Backend, but for it to be used as a webserver, there are some tools that need to be ported, converted or even created, some of these tools, like the File System (fs) are specific to NodeJS.
That's it! TLDR is that your code won't work because it's being executed in the wrong place. You can fix that in many ways, like this one, but maybe you can find a better path understanding how NodeJS works
Browsers cannot access file systems like that. Nodefs will not work within the browser
The NodeJS modules only works on the server side, you can't use it client side (that also include the require() syntax).
If you want to read a file from the server, you might want to use an AJAX directed to the route that has a controller to read the targeted file, which then the result of the AJAX is handled client side with vanilla JS.
I have a C++ application which has to execute a Javascript-function from a dynamic file. (I need to read a proxy.pac file).
E.g. I have a C++ application running which reads the following file: proxy.pac (which contains the javascript function FindProxyForURL(url, host), which I have to call with the two parameters.
However, I have no idea how to start off and I can't find anything on the internet so far.
So basically my question is: how doe I load dynamic Javascript from a file and execute a function within that code(/file)
I made application server using TinyJS.
see this.
https://github.com/pochi0701/wizdlive
Here is my code: http://pastebin.com/rZKRTGUB
I am not sure why I am getting require is not defined on Line 4
require is part of the node runtime environment and does not exist in browsers. It looks like you're trying to run this in the browser (in the <script> tags). Likely, you should be creating a server in node and then using the code you've written to talk to the database.
Yours is client side code, so require() is obviously not defined.
You either move your code in a node server or you drop http://requirejs.org/docs/download.html in your script if you want to use that API in the browser.
i have a c++ file which reads values from a sensor and I want to display those values on a website dynamically. So Im looking for a way to pass these values(integers) from my cpp file to an javascript which displays them on the site.
My first, simple try was to write the values into a js file as variables every second from my cpp script. The Js then uses this file as a source and displays its variables on the site:
cpp:
fprintf(file, "var mx=%d, my=%d, mz=%d, ax=%d, ay=%d, az=%d, gx=%d, gy=%d, gz=%d;\n",
imu.raw_m[0], imu.raw_m[1], imu.raw_m[2], // M = Magnetometer
imu.raw_a[0], imu.raw_a[1], imu.raw_a[2], // A = Accelerometer
imu.raw_g[0], imu.raw_g[1], imu.raw_g[2] // G = Gyroscope
);
html/js:
<script src="./imu.js" type="text/javascript"></script>
The Problem now is of course, that I need to refresh the page all the time, because the imu.js file is cached by the website.
I'd rather have a way to directly pass to integers from the cpp file to the js script. I read something about json or Googles V8 script. But I'd like to hear your suggestions first.
By the way, Im running this on a raspi, if this is important.
Thanks for your help
EDIT:
I'm goning to try it with a mysql database, in which my cpp file writes the data from the sensor with Connector/c++ from http://dev.mysql.com/doc/connector-cpp/en/ and my website reads them.
You could compile your C++ code into a Node.js plugin, you can then register a JavaScript function with your plugin which the C++ calls when it updates the value. That way you can pass values directly from C++ into Javascript in a managed and controlled way.
Node.js has the added benefit of being able to host your webpage and do all the Websocket and HTTP stuff that can be a pain in C++.
You do not have to refresh if your script is smart about how to access the data file! In case you do have a webserver at hand: Take care that your data file is accessible by your webserver and then let your script request the file via ajax (link to w3schools)
I'm doing something similar on a BeagleBone Black. With websocketd you can turn pretty much any program into a websocket endpoint and then send data via stdin and stdout commands. This would be a particularly good solution for you since websockets are designed to handle information that's constantly changing.
Inside HTTP adapter, I am getting JSON object back from REST service. I need to do some parsing of the reply before returning it back to the client.
I figured I can have another JavaScript file to do the parsing, so not to clatter my adapter.js too much.
What I don't know is how to make the 2nd java script file available in my adapter JS.
On client side I would use something like $.getScript("some.js");
JAVA classes can be accessed simply with classpath.className, but I can't find any references on how to load another Java Script file!
Please, help!
You cannot have additional JavaScript files referenced from adapter's JS.