Node.js:中间件和回调函数的执行顺序?

rot

我对node.js相当陌生,我的起点是app.js,它调用一个名为的文件xmlParser.js,该文件使用xml2js节点模块解析输入的xml文件这是什么app.js样子,

//include the modules
var express = require('express'),
    app = express(),
    ejs = require('ejs'),
    xmlParser = require('./utils/xmlParser.js');

//save the pain of writing .ejs after each render
app.set("view engine","ejs");

//these will hold the result of the function in the file xmlParser
var listJSON, logJSON = {};

app.get('/portfolio', function(req, res, next){
    //call parse function in file xmlParser.js
    xmlParser.parse(__dirname + "/xml/svn_log.xml", listJSON);
    xmlParser.parse(__dirname + "/xml/svn_list.xml", logJSON);
    console.log("middleware was excuted!");
    next();
}, function(req, res){
    console.log(listJSON);
});

现在这是文件的xmlParser.js样子,

//include the modules
var fs = require('fs'),
    xml2js = require('xml2js'),
    parser = new xml2js.Parser();

//this function parse xml file with name as filename to json and stores it in variable outputJSON
function parse(filename, outputJSON){
    fs.readFile(filename, function(err, data){
        if(err){
            console.log('cannot read file.');
        } else {
            parser.parseString(data, function(err, result){
                if(err) console.log('cannot parse file.');
                else {
                    outputJSON = result;
                }
            });
        }
    });
}

module.exports = {
    parse
}

现在,当我运行该应用程序并转到路由时,/portfolio我希望将其打印出来:

middleware was executed!
[object]

但这就是我在节点控制台上得到的,

middleware was executed!
undefined

现在,我想要的功能是xmlParser.js执行并将解析的JSON对象存储在listJSON传递给它对象中。当我listJSON作为parse()函数的第二个参数传递时,它是否通过引用传递?为什么我得到“ undefined printed when my function in the filexmlParser.js”在其中存储对象?

格申·帕皮(Gershon Papi)

一个问题是,你的parse函数调用fs.readFileparser.parseString它们是异步的。第二个问题是您在函数中更改了对象:JavaScript通过对象共享传递参数。含义:原始变量按值传递:更改参数不会更改源变量。非原始变量(如对象和数组)也不能更改,但它们的属性也可以更改。

虽然确实在调用parse之前先调用next,但是异步读取文件,然后异步解析(而不阻塞您的路由代码),这next要比程序完成解析文件的时间来得早。

您可以做的是一步一步地传递异步操作,并使解析返回结果,然后进行设置。首先将您的parse函数更改为接受回调并调用它:

function parse(filename, callback){
    fs.readFile(filename, function(err, data){
        if(err){
            console.log('cannot read file.');
            return callback(err);
        } else {
            parser.parseString(data, function(err, result){
                if(err) {
                   console.log('cannot parse file.');
                   return callback(err);
                }
                else {

                    return callback(null, result);
                }
            });
        }
    });
}

然后,将解析函数与函数一起传递next

app.get('/portfolio', function(req, res, next){
    xmlParser.parse(__dirname + "/xml/svn_log.xml", function(err,  list) {
      listJSON = list;
      xmlParser.parse(__dirname + "/xml/svn_list.xml", function(err, log) {
        logJSON = log;
        next();
      });
    });
    console.log("middleware was excuted!");
}, function(req, res){
    console.log(listJSON);
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js中间件包装

来自分类Dev

基本的node.js中间件

来自分类Dev

Node Express:未执行 Passport JWT 中间件

来自分类Dev

为什么Node.js不执行回调函数?

来自分类Dev

Node js中的回调函数是否以同步方式执行?

来自分类Dev

如何在node.js中执行回调函数?

来自分类Dev

使用函数对象的 Node.js 自定义中间件

来自分类Dev

使用Stylus和CoffeeScript中间件是否会降低Node.js Express应用的速度?

来自分类Dev

Node JS较少中间件无法自动编译

来自分类Dev

Node.js-导致404的外部中间件

来自分类Dev

在Node.js / Express中连接中间件

来自分类Dev

如何编写中间件以修改Node JS中的响应

来自分类Dev

用于Node.js的Passport中间件

来自分类Dev

Node js:猫鼬中间件中的Bluebird Promisify

来自分类Dev

Node.js中的回调顺序

来自分类Dev

node.js回调函数dynamodb

来自分类Dev

来自node.js的回调函数

来自分类Dev

回调函数问题Node.js

来自分类Dev

如何使用Node.js,Express和不太中间件来编译2种以上的LESS样式?

来自分类Dev

node.js + express,路由器在单独的文件和中间件中仅在某些路由之前?

来自分类Dev

如何使用Node.js,Express和更少中间件来编译2种以上的LESS风格?

来自分类Dev

在使用 node.js 和 Express 构建的 api 中使用 cors 中间件时出现 CORS 错误

来自分类Dev

Node.js:mongoose.once('open')不执行回调函数

来自分类Dev

在node.js中将函数的执行同步为回调参数

来自分类Dev

无极中间件在节点js回调函数中如何使用多个呢?

来自分类Dev

小node.js示例中的回调队列顺序

来自分类Dev

小node.js示例中的回调队列顺序

来自分类Dev

要求Node.js / Express.js中间件没有方法'...'

来自分类Dev

使用Node.js的Passport.js身份验证中间件

Related 相关文章

  1. 1

    Node.js中间件包装

  2. 2

    基本的node.js中间件

  3. 3

    Node Express:未执行 Passport JWT 中间件

  4. 4

    为什么Node.js不执行回调函数?

  5. 5

    Node js中的回调函数是否以同步方式执行?

  6. 6

    如何在node.js中执行回调函数?

  7. 7

    使用函数对象的 Node.js 自定义中间件

  8. 8

    使用Stylus和CoffeeScript中间件是否会降低Node.js Express应用的速度?

  9. 9

    Node JS较少中间件无法自动编译

  10. 10

    Node.js-导致404的外部中间件

  11. 11

    在Node.js / Express中连接中间件

  12. 12

    如何编写中间件以修改Node JS中的响应

  13. 13

    用于Node.js的Passport中间件

  14. 14

    Node js:猫鼬中间件中的Bluebird Promisify

  15. 15

    Node.js中的回调顺序

  16. 16

    node.js回调函数dynamodb

  17. 17

    来自node.js的回调函数

  18. 18

    回调函数问题Node.js

  19. 19

    如何使用Node.js,Express和不太中间件来编译2种以上的LESS样式?

  20. 20

    node.js + express,路由器在单独的文件和中间件中仅在某些路由之前?

  21. 21

    如何使用Node.js,Express和更少中间件来编译2种以上的LESS风格?

  22. 22

    在使用 node.js 和 Express 构建的 api 中使用 cors 中间件时出现 CORS 错误

  23. 23

    Node.js:mongoose.once('open')不执行回调函数

  24. 24

    在node.js中将函数的执行同步为回调参数

  25. 25

    无极中间件在节点js回调函数中如何使用多个呢?

  26. 26

    小node.js示例中的回调队列顺序

  27. 27

    小node.js示例中的回调队列顺序

  28. 28

    要求Node.js / Express.js中间件没有方法'...'

  29. 29

    使用Node.js的Passport.js身份验证中间件

热门标签

归档