我正在使用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上编写事件驱动的代码?
答案 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();
});
}