node.js如何访问参数的成员方法?

时间:2014-03-01 13:06:21

标签: javascript node.js express

我正在使用node.js而且我是node.js和javascript的noob。

我的服务器使用快速模块,客户端和服务器使用“JSON字符串”格式进行通信。

//server.js
var express = require('express');
var app = express();
app.use(express.json());
app.use(express.urlencoded());

app.post('/', function(request, response)
{
    switch(req.body['SERVICETYPE'])
    {
         case 'TEST':
            console.log("test queried : ["+JSON.stringify(request.body)+"]");
            response.send(request.body);
            response.end();
            break;
         case 'TEST_USING_HANDLER':
            console.log("test with handler queried : ["+JSON.stringify(request.body)+"]");
            require('./testhandler.js).TryTest(requst, response);
            break;
    }
});

本机'test'类型服务无法使用。
因为服务器必须向客户端返回响应,但许多长时间接受函数必须使用处理程序发送响应。(如DB Access)

我的testhandler.js是下一个

//testhandler.js
function TryTest(req, res)
{
   var mysql = require('mysql');
   var connection = mysql.createConnection({
    hostname : 'localhost',
        user : 'gameserver',
    password : 'game0',
    database : 'game0'
   });
   connection.connect();
   console.log("findusername = "+req.body['name']);
   connection.query('select * from USE_USERS where name = '+req.body['name'], function(err, rows, cols)
    {           
        if(err) throw err;
        var rtv;
        if(rows[0])
        {
            rtv = {};
            rtv['id'] = rows[0]['id'];
            rtv['name'] = rows[0]['name'];
            rtv['passwd'] = rows[0]['passwd'];
        }
        TestReturn(rtv, req, res);

    });
}


function TestReturn(rtv, req, res)
{
    res.send(JSON.stringify(rtv));
    res.end();
}

并且代码可能感觉为伪(我将其编码为stackoverflow编辑器) 但是这种情况,它会返回错误 对象#没有方法'发送'(在 TestReturn 功能上)

我无法调用 res.send() res.end()超出 app.post 的范围事件处理函数。
我认为这可能是因为javascript没有用户控制类型系统(如类型转换,如关键字)。 我如何在node.js上编写事件驱动的代码?

1 个答案:

答案 0 :(得分:3)

重构function TryTest(req, res)以使用回调。

function tryTest(body, callback) {
   // in the event of an error.
   if(database.error) { 
      callback(database.error, null); 
   }

   // if we process successfully 
   callback(null, result);
}

(旁注:在JS中,用一个大写启动一个函数名意味着它是一个对象构造函数,在这种情况下你定义一个静态函数,所以它应该是小写的tryTest())。

这个新的功能签名有几个好处。

  • 遵循异步方法的节点约定。这意味着许多其他模块可以立即使用此功能,其他节点程序员将立即了解它的功能。
  • 现在只有一个责任,写入数据库。在预期写入数据库并处理发送响应之前。我们可以通过允许它们传递回调来给调用者提供该控制,在我们完成数据库操作之后运行一些代码。

所以在您的主应用代码中:

var testHandler = require('./testhandler);

app.post('/', function(request, response) {
    ...
    var body = request.body;
    testHandler.tryTest(body, function(err, rtv){
      err ? res.send(500, json.stringify(err) : res.send(200, JSON.stringify(rtv));
      res.end(); 
    });
}