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 条评论
登录 后参与评论

相关文章

什么是Node.js的Connect,Express和“中间件”?

来自node.js的回调函数

带有自定义Http代理和Connect.js中间件的Node.js代理

如何在两个中间件node.js和apollo服务器之间共享变量?

Node.js / Express:中间件内部的异步函数?

将中间件放入Node js + Express

Node.js多种中间件导出模式

带有express的Node.js:为什么我的中间件执行两次这是代码

如何使基于角色的中间件以Node.js和Mongoose中的适当权限访问api?

Node Cors捕获中间件回调错误

Node js优化回调函数和nodemailer?

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

Node.js中的回调顺序

Node.js中间件包装

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

回调函数问题Node.js

用于Node.js的Passport中间件

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

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

基本的node.js中间件

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

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

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

Node Express:未执行 Passport JWT 中间件

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

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

使用 Node.js / Express 是否可以从 IIFE 内部执行 next() 错误并推进到错误处理中间件?

Node.js Express - 模块与中间件

Node.js 中间件无法正常工作