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

我使用node.js
和noob的node.js和JavaScript。

我的服务器正在使用快速模块
客户端和服务器以“JSONstring”格式进行通信。

//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 qurried : ["+JSON.stringify(request.body)+"]"); response.send(request.body); response.end(); break; case 'TEST_USING_HANDLER': console.log("test with handler qurried : ["+JSON.stringify(request.body)+"]"); require('./testhandler.js).TryTest(requst, response); break; } }); 

本地“testing”types的服务是不能使用的。
因为服务器必须对客户端返回一个响应 ,但是很多长时间使用函数都必须使用处理程序来发送响应 (如数据库访问)

接下来是我的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没有用户控制types系统(如typecast,作为关键字)。 我怎么能在node.js上编写事件驱动的代码?

重构function TryTest(req, res)使用callback。

 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())。

这个新的function签名有几个好处。

  • 它遵循asynchronous方法的节点约定。 这意味着许多其他模块可以立即使用此function,其他节点程序员将立即明白它的作用。
  • 它现在有一个单一的责任,写入数据库。 在预计写入数据库并处理发送响应之前。 我们可以通过允许调用者传递callback,在完成数据库操作之后运行一些代码来控制调用者。

所以在你的主应用程序代码中:

 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(); }); }