承诺在callback中给出未定义的结果

fileUpload.js

var Uploader = require('s3-image-uploader'); var express = require('express'); var config = require('./../config.js'); var Promise = require('promise'); var uploader = new Uploader({ aws: { key: config.awsKey, secret: config.awsSecret }, websockets: false }); exports.fileUpload = function(fileName) { new Promise(function(resolve, reject) { uploader.upload({ fileId: 'someUniqueIdentifier', bucket: 'quflip', source: './public/images/' + fileName, name: fileName }, function(data) { // success console.log('upload success:', resolve); resolve(data); }, function(errMsg, errObject) { //error reject(false); }); }); }; 

logintest.js

 var awsUpload = require('./../config/fileUpload.js'); var userData = function(req, res) { console.log("true/false" + awsUpload.fileUpload(profile_image)); 

这里发生的是,我正在console.log中获取未定义的值。 所以这意味着callback不传递数据。 如何有效地将数据传递给进一步的目的

如果你想让你的函数实际返回promise,那么改变它:

 exports.fileUpload = function (fileName) { new Promise(function(resolve, reject) { // ... }); }; 

对此:

 exports.fileUpload = function (fileName) { return new Promise(function(resolve, reject) { // ... }); }; 

没有return语句,你创build的promise就不会被你的函数返回。

但即使如此,你将无法像这样使用它:

 console.log("true/false" + awsUpload.fileUpload(profile_image)); 

你将不得不使用这样的东西:

 awsUpload.fileUpload(profile_image).then(result => { console.log("true/false" + result); }); 

或者,如果你使用async / await ,你在async函数:

 console.log("true/false" + await awsUpload.fileUpload(profile_image)); 

你需要链接到承诺.then然后在那里做日志。 首先,确保你return诺言

 return new Promise(function(resolve, reject) { 

那么,你可以做:

 var userData = function (req, res) { awsUpload.fileUpload(profile_image).then(data => { console.log("true/false" + data); }); } 

如果您在支持async / await的环境中工作,则可以更简单地执行此操作:

 var userData = async function (req, res) { console.log("true/false" + await awsUpload.fileUpload(profile_image)); }; 

请记住,这将返回一个承诺。

虽然我没有看到profile_image被设置在哪里。