【问题标题】:NodeJS/Express GET exit status of external applicationNodeJS/Express GET 外部应用程序的退出状态
【发布时间】:2017-02-02 13:54:00
【问题描述】:

我对 NodeJS 很陌生,这是我第一次使用 Express 4,我正在尝试围绕命令行应用程序构建一个简单的 RESTful 前端。最终将只需要一个 GET 和一个 POST,而 POST 处理大约 3 或 4 个不同的参数。 GET 应该使用所有默认参数调用命令行应用程序,这基本上只是一个状态检查,并在完成后返回退出状态。 POST 将在命令行上传递 POST 参数。我知道这基本上需要一个异步调用,例如 child_process.execFile(),但我似乎无法弄清楚如何从回调函数中实际返回响应。

这是我作为起点的教程,省略了mongoose依赖,因为我不需要MongoDB,所以我基本上只是跟着它到你启动服务器的地步。在这一点上,我很迷茫。我一直讨厌写异步代码...

var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser     = require('body-parser');
var child_process  = require('child_process');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 8080;        // set our port

var router = express.Router();              // get an instance of the express Router

router.get('/', function(req, res) {
    res.json({ message: 'hooray! welcome to our api!' });
});

router.get('/myapp/status', function(req, res) {
    console.log(req.user);
    child_process.execFile(
            'casperjs',
            ['myfile.js', '--cmd="Status"', '--user="myuser"', '--pass="#mypass"'],
            null,
            function(response) {
                // ???
            }, res);
});

app.use('/api', router);

app.listen(port);
console.log('Magic happens on port ' + port);

【问题讨论】:

    标签: node.js express asynchronous


    【解决方案1】:

    您可以尝试以下方法:

    router.get('/myapp/status', function(req, res) {
       console.log(req.user);
       child_process.execFile(
            'casperjs',  //command
            ["myfile.js --cmd=Status --user=myuser --pass=#mypass"],  // args
            function(err, stdout, stderr) { //callback
                if (err) {
                   return res.status(500).send(err);
                }
                res.send(stdout);  // to send response to client
            });
    });
    

    【讨论】:

    • 但是匿名回调函数怎么知道 res 是什么?我很确定我已经尝试了一些类似的想法,但它总是出错“res没有成员函数发送”(或类似的东西)。有没有办法将 res 的引用传递给回调?
    • 由于作用域,父变量可以在子匿名函数中访问。我试过了,效果很好。
    • 好的,看来回调永远不会被调用。只是为了确认一下,假设我调用的外部命令是casperjs myfile.js --cmd="Status" --user="myuser" --pass="#mypass",我是否得到了正确的语法
    • 您还面临这个问题吗?
    • 明天我会再调查一下,然后回帖。我非常感谢您的帮助,我只需要离开一天(这是一个更大的项目的一部分,比它应该付出的努力更多)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2020-07-03
    • 2015-04-24
    • 2018-09-14
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多