Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么在我的头上+;Express REST API调用my函数的承诺失败,而setTimeout的相同承诺有效吗?_Node.js_Rest_Express_Google Maps_Promise - Fatal编程技术网

Node.js 为什么在我的头上+;Express REST API调用my函数的承诺失败,而setTimeout的相同承诺有效吗?

Node.js 为什么在我的头上+;Express REST API调用my函数的承诺失败,而setTimeout的相同承诺有效吗?,node.js,rest,express,google-maps,promise,Node.js,Rest,Express,Google Maps,Promise,我有一个NodeJS+expressrestapi方法执行反向地理编码(使用googlemapsapi)。 我试图用承诺来解决这个问题,但“then”在我的函数返回Google的答案之前就被执行了。 当只调用setTimeout测试同一代码时,它会按预期工作。请参阅代码中的注释(简化版本) app.get('/api/v1/events',verifyToken,异步(req,res)=>{ 等待db.poolPromise.then(pool=>{ 返回池。请求() .input('UserI

我有一个NodeJS+expressrestapi方法执行反向地理编码(使用googlemapsapi)。 我试图用承诺来解决这个问题,但“then”在我的函数返回Google的答案之前就被执行了。 当只调用setTimeout测试同一代码时,它会按预期工作。请参阅代码中的注释(简化版本)

app.get('/api/v1/events',verifyToken,异步(req,res)=>{
等待db.poolPromise.then(pool=>{
返回池。请求()
.input('UserId',db.sql.UniqueIdentifier,res.authData.UserId)
.input('DateFrom',db.sql.DateTime2(7),req.query.DateFrom)
.input('DateTill',db.sql.DateTime2(7),req.query.dateTo)
.output('UserIdAuthorized',db.sql.Bit)
.execute('sp'))
})。然后(结果=>{
让输出=(result.output | |{})
如果(!output.UserIdAuthorized){
res.sendStatus(403)
}
else if(result.recordset.length>0){
(新承诺((决议)=>{
//resolve(123)//这个按预期工作
//setTimeout(resolve,3000,'temp success')//这一个按预期工作
//***这一个通过,然后在其应答之前执行以下操作***
解析(getAddress_测试(result.recordset))
// **************************************************************************************
})).然后(函数(值){
res.json(
{
meta:{count:10},//这只是一个示例
结果:值//***此项失败,未定义***
})
})
}否则{
res.sendStatus(404)
}
}).catch(错误=>{
res.sendStatus(500)
控制台错误(err)
})
});
const nodegegocoder_选项={
提供商:“谷歌”,
apiKey:process.env.GOOGLE\u API\u KEY
}
异步函数getAddress\u测试(记录集){
//用于调试的示例记录集-因为您没有我的数据库
[2.4920483},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,“:-1.153185},{'eventId':14205801,'Lat':53.68687,'Lon':-1.498708},{'eventId':14206041,'Lat':51.471521,'Lon':-0.2038033},{'eventId':14206049,'Lat':51.471521,'Lon':-0.2038033},{'eventId':14206072,'Lat 51.471521,'803lon':-0.2033}]
让geocoder=nodeGeocoder(nodeGeocoder_选项)
设ps=[]
for(var i=0,length=recordset.length;i0
&&记录集[i-1]。Lat==记录集[i]。Lat
&&记录集[i-1].Lon==记录集[i].Lon){
ps.push(新承诺(功能)(解决){
解析(反向编码(地理编码器,记录集[i].Lat,记录集[i].Lon))
}))
}否则{
ps.push('-')
}
}
等待承诺。全部(ps)
.然后(函数(值){
对于(变量i=0,长度=values.length;i{
地址=res[0]。格式化的地址
})
.catch(错误=>{
控制台错误(err)
});
}
回信地址
};

我确信我在这里遗漏了一些简单的东西…

基本问题是
getAddress\u TEST
函数返回一个无需任何东西就能实现的承诺(
未定义的
),因为它不包含
return
语句
callback,它会影响
wait
ed承诺的承诺解析,但结果会被丢弃

如果您想使用
async
/
wait
,您应该放弃任何
新承诺
然后
调用:

app.get('/api/v1/events', verifyToken, async (req, res) => {
    try {
        const pool = await db.poolPromise
        const result = await pool.request()
            .input('UserId', db.sql.UniqueIdentifier, res.authData.userId)
            .input('DateFrom', db.sql.DateTime2(7), req.query.dateFrom)
            .input('DateTill', db.sql.DateTime2(7), req.query.dateTo)
            .output('UserIdAuthorized', db.sql.Bit)
            .execute('sp')
        let output = (result.output || {})
        if (!output.UserIdAuthorized) {
            res.sendStatus(403)
        } else if (result.recordset.length > 0) {
            const value = await getAddress_TEST(result.recordset)
            res.json({
                meta: { count: 10 }, //this is just a sample
                result: value
            })
        } else {
            res.sendStatus(404)
        }
    } catch(err) {
        res.sendStatus(500)
        console.error(err)
    }
});

const nodeGeocoder_options = {
    provider: 'google',
    apiKey: process.env.GOOGLE_API_KEY
}

async function getAddress_TEST(recordset) {
    const geocoder = nodeGeocoder(nodeGeocoder_options)
    const ps = recordset.map((record, i) => {
        if (i == 0 || !(i > 0
            && recordset[i - 1].Lat == record.Lat
            && recordset[i - 1].Lon == recordLon)) {
            return reverseGeocode(geocoder, recordset[i].Lat, recordset[i].Lon))
        } else {
            return '-'
        }
    });

    const values = await Promise.all(ps)
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    for (var i = 0, length = values.length; i < length; i++) {
        if (values[i] != '-') {
            recordset[i].locationAddress = values[i]
        } else {
            recordset[i].locationAddress = recordset[i - 1].locationAddress
        }
    }
    recordset.forEach(function (v) {
        delete v.Lat
        delete v.Lon
    });
    console.log(recordset)
    return recordset
//  ^^^^^^^^^^^^^^^^
}

async function reverseGeocode(geocoder, lat, lon) {
    if (lat != 0 && lon != 0) {
        const res = await geocoder.reverse({ lat: lat, lon: lon })
        return res[0].formattedAddress
    }
    return '+'
}
app.get('/api/v1/events',verifyToken,异步(req,res)=>{
试一试{
const pool=wait db.poolPromise
const result=wait pool.request()
.input('UserId',db.sql.UniqueIdentifier,res.authData.UserId)
.input('DateFrom',db.sql.DateTime2(7),req.query.DateFrom)
.input('DateTill',db.sql.DateTime2(7),req.query.dateTo)
.output('UserIdAuthorized',db.sql.Bit)
.execute('sp'))
让输出=(result.output | |{})
如果(!output.UserIdAuthorized){
res.sendStatus(403)
}else if(result.recordset.length>0){
常量值=等待getAddress\u测试(result.recordset)
res.json({
meta:{count:10},//这只是一个示例
结果:价值
})
}否则{
res.sendStatus(404)
}
}捕捉(错误){
res.sendStatus(500)
控制台错误(err)
}
});
const nodegegocoder_选项={
提供商:“谷歌”,
apiKey:process.env.GOOGLE\u API\u KEY
}
异步函数getAddress\u测试(记录集){
常数地理编码器=nodeGeoc
app.get('/api/v1/events', verifyToken, async (req, res) => {
    try {
        const pool = await db.poolPromise
        const result = await pool.request()
            .input('UserId', db.sql.UniqueIdentifier, res.authData.userId)
            .input('DateFrom', db.sql.DateTime2(7), req.query.dateFrom)
            .input('DateTill', db.sql.DateTime2(7), req.query.dateTo)
            .output('UserIdAuthorized', db.sql.Bit)
            .execute('sp')
        let output = (result.output || {})
        if (!output.UserIdAuthorized) {
            res.sendStatus(403)
        } else if (result.recordset.length > 0) {
            const value = await getAddress_TEST(result.recordset)
            res.json({
                meta: { count: 10 }, //this is just a sample
                result: value
            })
        } else {
            res.sendStatus(404)
        }
    } catch(err) {
        res.sendStatus(500)
        console.error(err)
    }
});

const nodeGeocoder_options = {
    provider: 'google',
    apiKey: process.env.GOOGLE_API_KEY
}

async function getAddress_TEST(recordset) {
    const geocoder = nodeGeocoder(nodeGeocoder_options)
    const ps = recordset.map((record, i) => {
        if (i == 0 || !(i > 0
            && recordset[i - 1].Lat == record.Lat
            && recordset[i - 1].Lon == recordLon)) {
            return reverseGeocode(geocoder, recordset[i].Lat, recordset[i].Lon))
        } else {
            return '-'
        }
    });

    const values = await Promise.all(ps)
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    for (var i = 0, length = values.length; i < length; i++) {
        if (values[i] != '-') {
            recordset[i].locationAddress = values[i]
        } else {
            recordset[i].locationAddress = recordset[i - 1].locationAddress
        }
    }
    recordset.forEach(function (v) {
        delete v.Lat
        delete v.Lon
    });
    console.log(recordset)
    return recordset
//  ^^^^^^^^^^^^^^^^
}

async function reverseGeocode(geocoder, lat, lon) {
    if (lat != 0 && lon != 0) {
        const res = await geocoder.reverse({ lat: lat, lon: lon })
        return res[0].formattedAddress
    }
    return '+'
}