无法在nodejs中同步运行一个函数并表达

Unable to run a function synchronously in nodejs and express

我在这个项目中使用了 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,[= 的最后一个 return 语句13=] 在 htmlWikiText 填充内容之前执行。所以我总是在浏览器页面上看到hello initial。尽管一段时间后由于 console.log 语句它被打印在终端上。

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

我不会尝试将此代码转换为同步代码。我将更正它以作为异步版本工作。

您需要将回调传递给 wikitext() 和 return 该回调中的值。这是修改后的 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);

    });
});