首页 > 解决方案 > JavaScript 承诺和 Node.js

问题描述

我有一个简单的 Node.js 服务器,我正在尝试使用一个名为image-similarity的 Node.js 包,根据它的文档,它的使用方式如下:

let  imageSimilarity  = require ('image-similarity') ; 
imageSimilarity('./image/1.jpg', './image/2.jpg').then ( res =>  { 
    console.log(res) ; // The  similarity is 0.8162515507509954 
} ) ;

它可以正常工作,但我试图在 HTTP Node.js 服务器中使用它,如下所示:

var http = require('http');
var imageSimilarity = require('image-similarity');

http.createServer(function handler(req, res) {
    res.writeHead(200, {'Content-Type' : 'text/plain'});

    var result = "";

    imageSimilarity('./images/1.png', './images/2.png').then(res => {
        result = res;
    });

    res.end(result);
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

我只需要将结果添加到响应中,但我发现我无法res从 then 内部访问变量function,并且我不能像上一个示例中那样简单地将结果分配给变量,因为该块是异步执行的,它只会是当我尝试在外面使用它时是空的。

标签: javascriptnode.jses6-promise

解决方案


你遇到了异步的问题,你需要res.end(result)从你的内部调用then()

var http = require('http');
var imageSimilarity = require('image-similarity');

http.createServer(function handler(req, res) {
    res.writeHead(200, {'Content-Type' : 'text/plain'});

    imageSimilarity('./images/1.png', './images/2.png').then(result => {
        res.end(result);
    });


}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

我还注意到我重命名了then' 参数result以避免与外部命名冲突res


推荐阅读