Does node.js not include packages in opkg yet?
-
@Boken-Lin said:
@Fred-Blais Not yet, unfortunately... But we won't stop until it's done! Getting Javascript support is something we've promised, and we'll deliver it in both Node.js and IoT.js
Have a look at this document : http://www.soscon.net/download/day28/GB2/S_28_1050_μ΄μΆμ.pdf
It looks to me that IoT.js is a much more logical choice than Node.js on the Omega
JerryScript takes anywhere from 100-300kb depending on the install, the V8 javascript engine takes about 10MB.
10MB is a lot on a 16MB device... IoT.js is also Node compatible.
-
@Philipp-Czarnetzki Seems like you are trying to compile the module for x86-64? Did you set up the cross-compile environment for Omega?
node-gyp
by default compiles the module for the machine you are running it on. In order to use it to compile for the Omega, you will need to tellnode-gyp
to compile using the Omega toolchain. You can download the Omega toolchain from here: https://s3-us-west-2.amazonaws.com/onion-cdn/community/openwrt/OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2.
-
@Fred-Blais Yes, I totally agree that IoT.js is a much better choice for embedded platforms like the Omega. I wish we had heard about it earlier Also, thanks for the link to the document. It provides quite a bit of useful information.
-
@Boken-Lin How Do I do this?
-
@Philipp-Czarnetzki Have you looked at our wiki article on setting up the cross-compile environment for the Omega? If not, it's here: https://wiki.onion.io/Tutorials/Cross-Compile. Once you have that setup, you need to setup the environment variables like
CC
andCXX
to pointnode-gyp
to the compiler for cross compilation. To compile you will need to usenode-gyp --arch mips configure build
, however, bear in mind that most modules out there probably don't have MIPS architecture support designed, you might need to manually port over some stuff if you see some error during your compilation.
-
@Boken-Lin I have compiled my module for MIPS Arch but now i get a "File not found" Error from node if i want to require it.
root@Omega-XXXX:/mnt/sda1/test/build/Release# node` > var hello = require('./hello') Error: File not found at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17) at require (module.js:380:17) at repl:1:13 at REPLServer.self.eval (repl.js:110:21) at repl.js:249:20 at REPLServer.self.eval (repl.js:122:7) at Interface.<anonymous> (repl.js:239:12) at Interface.EventEmitter.emit (events.js:95:17)
-
@Philipp-Czarnetzki where did you put the hello file? Accessing it with ./hello would mean that a file called 'hello' without a .js is being looked for in the same folder you executed the command in.
-
@Philipp-Czarnetzki Did you place the module inside a folder called
node_modules
?
-
Node file/directory/module loading
https://nodejs.org/api/modules.html
-
@Boken-Lin Nope i copied the entire folder containing the compiled hello world example and launched a repl in the folder that i posted above.
-
@Philipp-Czarnetzki I think in order to require a module, you will need to put it in
node_modules
directory. If you just have thehello
directory, you should tryrequire('./hello/hello');
.
-
@Boken-Lin I've placed it in a
hello
folder withinnode_modules
but if i require it like you said i get aModule/File not found
, i also placed apackage.json
in there but it wont work
-
@Philipp-Czarnetzki Did you change the name of your JS file in the
hello
folder toindex.js
? I believe that's the default file name for the require system to start looking.
-
@Boken-Lin Ok, so I'm having an issue running a node package on the Omega. Node works fine for simple things, but with the node-tweet-stream NPM package (installed on my Mac first, then copied over to the Omega), I continue to receive an error (see below). I backed my Mac node version down to v0.10.5 and ran the script without error. However, when the same exact script is run on the Omega, I get the following error. Note that node-tweet-stream is an uncompiled module....any ideas??
/mnt/sda1/node-tweet-stream/node_modules/node-tweet-stream/lib/twitter.js:270 this.stream.abort() ^ TypeError: Cannot call method 'abort' of null at Twitter.abort (/mnt/sda1/node-tweet-stream/node_modules/node-tweet-stream/lib/twitter.js:270:15) at null.<anonymous> (/mnt/sda1/node-tweet-stream/node_modules/node-tweet-stream/lib/twitter.js:257:10) at Request.EventEmitter.emit (events.js:95:17) at IncomingMessage.<anonymous> (/mnt/sda1/node-tweet-stream/node_modules/node-tweet-stream/node_modules/request/request.js:965:12) at IncomingMessage.EventEmitter.emit (events.js:95:17) at readableAddChunk (_stream_readable.js:132:14) at IncomingMessage.Readable.push (_stream_readable.js:113:10) at HTTPParser.parserOnBody [as onBody] (http.js:140:22) at CleartextStream.socketOnData [as ondata] (http.js:1535:20) at CleartextStream.read [as _read] (tls.js:470:10)
-
@Steve-Fister Hmmm, that's very strange. From the error message it seems that
this
wasn't correctly referenced, so it's an empty object. What was the line in your code that triggered this error?
-
@Boken-Lin Well, it appears that something is missing from either the node.js package or from the OS. I've tried several twitter node modules, all with varying degrees of failure (yet work on my Mac perfectly fine). In particular, the errors seem to indicate the problem is with authenticating to Twitter apis (I have verified the credentials do work as this EXACT same script runs on the Mac).
My code running in index.js is very simple:
var Twit = require('twit') var T = new Twit({ consumer_key: 'XXX' , consumer_secret: 'XXX' , access_token: 'XXX' , access_token_secret: 'XXX' }) // // filter the twitter public stream by the word 'mango'. // var stream = T.stream('statuses/filter', { track: 'mango' }) stream.on('tweet', function (tweet) { console.log(tweet) })
-
Oh, and this was a different node package called "twit". Here is the error received from running this:
{ [Error: Bad Twitter streaming request: 401] message: 'Bad Twitter streaming request: 401', code: null, allErrors: [], twitterReply: '<html>\\n<head>\\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\\n<title>Error 401 Unauthorized</title>\n</head>\n<body>\n<h2>HTTP ERROR: 401</h2>\n<p>Problem accessing \'/1.1/statuses/filter.json?track=mango\'. Reason:\n<pre> Unauthorized</pre>\n</body>\n</html>\n', statusCode: 401 }
-
@Steve-Fister This is helpful. I'm guess the error encountered with the other twitter plugin is the same thing.
this
referred to the request object, and because twitter responded with an error, it didn't contain astream
object. Now let's try to figure out why twitter responds with401
. Twitter says that401
message means the following:Authentication credentials were missing or incorrect.
Also returned in other circumstances, for example all calls to API v1 endpoints now return 401 (use API v1.1 instead).But you are saying that you are using the same code on both instances?
-
@Boken-Lin Well I think the "this" problem was specific to that script because it couldn't authenticate and as such, did not receive a stream. I've tested three different Twitter packages and they all pretty much fail with an authentication error. And, like I also mentioned, if I run the exact same scripts on my Mac, they all run just fine. These scripts don't all use the OAuth libraries either, so it's not and OAuth issues either. I'm thinking either the port of node v0.10.0 on OpenWRT is not complete, or there is a fundamental problem at the OS level on the Onion. However, I think it's more at the Node level, because I can run a curl script against the Twitter streaming API and authenticate just fine.
-
@Steve-Fister Can you send me a copy of your sources? I would like to try it out to figure out what the issue is. I've been able to make HTTP requests using node without much issue on the Omega, and I don't think the twitter login system requires any special HTTP request features.