【问题标题】:node.js how can I access parameter's member method?node.js 如何访问参数的成员方法?
【发布时间】:2014-03-01 13:06:21
【问题描述】:

我正在使用 node.js,我是 node.js 和 javascript 的菜鸟。

我的服务器正在使用 express 模块,客户端和服务器以 'JSON string' 格式通信。

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

无法使用本机“测试”类型的服务。
因为服务器必须返回一个response给客户端,但是很多长时间的take函数必须使用handler来发送一个response。(如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 函数上)

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

【问题讨论】:

  • 只是一个小问题——TEST-USERHANDLE|R 中的requst 错字——除此之外我还没有看到任何内容

标签: javascript node.js express


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2017-08-24
    • 2015-04-22
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多