节点REPL eval回调

时间:2012-05-23 03:58:47

标签: node.js read-eval-print-loop

我有一个小样本程序http://pastebin.com/5gFkaPgg,通过TCP为客户端提供REPL。根据文档http://nodejs.org/api/repl.html我通过eval函数(第11-13行)设置正确,但回调对象不是函数。我在文档中误解了什么?

  callback(null,result);
  ^
TypeError: object is not a function

不能回答我自己的问题......

根据https://github.com/joyent/node/blob/master/lib/repl.js 签名是

function(code, context, file, cb) {
  //code
  cb(err, result);
}

如果有更合适的解决方案,请告诉我。

1 个答案:

答案 0 :(得分:2)

错误和签名告诉我回调是作为其参数(code, context, file, cb)给出的,但期望它的参数(code, cb)因此context被绑定到cb并且context不是函数,错误产生了。

您需要做的是将给予repl.start的回调的参数列表更改为:

function(cmd, context, file, callback) {

或使用common:

function(cmd) {
  var callback = arguments[arguments.length-1]; // get the last argument

带有第二个选项的代码,因为它没有引入新名称:

var net = require('net');
var repl = require('repl');

function main() {
  var clients = [];

  net.createServer(function(socket) {
    clients.push(socket);

    repl.start(">", socket, function(cmd) {
      var callback = arguments[arguments.length-1];
      var result = cmd;

      callback(null,result);
    });
    socket.on('end',function() {
      clients.splice(clients.indexOf(socket));
    });
  }).listen(8000);
}

main();