无法在nodejs和express中同步运行函数

时间:2016-01-26 17:14:27

标签: node.js express asynchronous mean node-deasync

我已将wikipedia-js用于此项目。这是我summary.js文件的代码。

var wikipedia = require("wikipedia-js");
var something = "initial";
module.exports = {
    wikitext: function(topicname) {
        console.log("Inside wikitex funciton :" + topicname);
        var options = {
            query: topicname,
            format: "html",
            summaryOnly: false,
            lang: "en"
        };

        wikipedia.searchArticle(options, function(err, htmlWikiText) {
            console.log("Inside seararticlefunciton :");

            if (err) {
                console.log("An error occurred[query=%s, error=%s]", topicname, err);
                return;
            }
            console.log("Query successful[query=%s, html-formatted-wiki-text=%s]", topicname, htmlWikiText);
            something = htmlWikiText;
        });
        return something;
    },
};

我在/wiki/:topicname路线中使用的这个模块。 index.js中的相应代码就是这样。

router.get('/wiki/:topicname', function(req, res, next) {
    var topicname = req.params.topicname;
    console.log(topicname);
    var first = summary.wikitext(topicname);
    res.send("Hello "+first);
});

问题是,每当我访问wiki / some-topic 时,summary.js的最后一个返回语句在填充htmlWikiText之前执行内容。所以我总是在浏览器页面上看到hello initial。虽然有一段时间后由于console.log声明而在终端上打印。

那么我应该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我不打算尝试将此代码转换为同步代码。我只是纠正它作为异步版本。

您需要将回调传递给wikitext()并返回该回调中的值。以下是wikitext()的修订代码以及调用它的路径:

var wikipedia = require("wikipedia-js");
module.exports = {
    wikitext: function(topicname, callback) {
        console.log("Inside wikitex funciton :" + topicname);
        var options = {
            query: topicname,
            format: "html",
            summaryOnly: false,
            lang: "en"
        };

        wikipedia.searchArticle(options, function(err, htmlWikiText) {
            console.log("Inside seararticlefunciton :");
            if (err) {
                console.log("An error occurred[query=%s, error=%s]", topicname, err);
                return callback(err);
            }
            console.log("Query successful[query=%s, html-formatted-wiki-text=%s]", topicname, htmlWikiText);
            callback(null, htmlWikiText);
        });
    }
};


router.get('/wiki/:topicname', function(req, res, next) {
    var topicname = req.params.topicname;
    console.log(topicname);
    summary.wikitext(topicname, function(err, result) {
        if (err) {
            return res.send(err);
        }
        if (!result) {
            return res.send('No article found');
        }
        res.send("Hello "+result);

    });
});