Mac OS X NodeJS: has no method 'router' er

2019-02-19 09:12发布

问题:

Installed NodeJS v0.6.12 on MAC OS X using Mac Ports.

    win764:node iwaldman$ which node
         /opt/local/bin/node

    win764:node iwaldman$ node -v
         v0.6.12

Installed connect using npm install connect.

Wrote a simple program, connectServer.js:

    var connect = require('connect');
    var util    = require('util');

    function sendJSON(response, obj) {
        response.writeHead(200, {'Content-Type':'application/json'});
        var objStr = JSON.stringify(obj);
        util.debug('SENDJSON: ' + objStr);
        response.end(objStr);
    }

    var server = connect.createServer(
    connect.router(function(app){
        app.get('/foo', function(req, res){
            sendJSON(res, {path: 'foo'});
        })
        app.get('/bar', function(req, res){
            sendJSON(res, {parth: 'bar'});
        })
    })
    );

    server.listen(3000);

    util.debug('Server running at http://127.0.0.1:3000');

Run node connectServer.js.

Get the following error:

    win764:node iwaldman$ node connectserver.js 

    node.js:201
            throw e; // process.nextTick error, or 'error' event on first tick
                  ^
    TypeError: Object function createServer() {
      function app(req, res){ app.handle(req, res); }
      utils.merge(app, proto);
      utils.merge(app, EventEmitter.prototype);
      app.route = '/';
      app.stack = [].slice.apply(arguments);
      return app;
    } has no method 'router'
        at Object.<anonymous> (/Users/iwaldman/dev/node/connectserver.js:12:10)
        at Module._compile (module.js:441:26)
        at Object..js (module.js:459:10)
        at Module.load (module.js:348:31)
        at Function._load (module.js:308:12)
        at Array.0 (module.js:479:10)
        at EventEmitter._tickCallback (node.js:192:40)

Any ideas are appreciated.

回答1:

Alright, it's hard to say since it really looks like the tutorial you are following isn't using connect, but here is an example using connect that should work.

function sendJSON(response, obj) {
  response.writeHead(200, {'Content-Type':'application/json'});
  var objStr = JSON.stringify(obj);
  response.end(objStr);
}

function get(path, cb) {
  return function(req, res, next) {
    if (req.method != 'GET' || req.url != path) return next();
    cb(req, res, next);
  }
}

var connect = require('connect')
var app = connect()
  .use(connect.query())
  .use(get('/foo', function(req, res, next) {
    sendJSON(res, {path: 'foo'});
  }))
  .use(get('/bar', function(req, res, next) {
    sendJSON(res, {parth: 'bar'});
  }))
  .listen(3000);


回答2:

Install express and slightly rewrite the code:

var express = require('express');
var util    = require('util');

function sendjson(res,obj)
{
    res.writeHead(200, {
        'Content-Type': 'application/json',
    });

    var objstr = JSON.stringify(obj);
    util.debug('SENDJSON:' + objstr);
    res.end(objstr);
}


var app = express();

app.get('/foo', function(req,res) {
    sendjson(res, {path:'/foo'});
});

app.get('/bar', function(req,res) {
    sendjson(res, {path:'/bar'});
});

app.listen(3000);
util.debug('Server running at http://127.0.0.1:3000');


回答3:

I had the same question. Richard Rodger,the author of 'Beginning Mobile Application Development in the Cloud' suggested I should either use the dispatch module (https://github.com/caolan/dispatch) or install an older version of connect, using:

npm install git://github.com/senchalabs/connect.git#1.8.6

Hope this helps! :)