Javascript 如何在expressJs中完成实用程序执行后返回REST API响应
我已经用带有节点的expressJS编写了一个POST端点。当我调用API时,它会使用setInterval()运行一个实用程序,我希望在实用程序执行clearInterval()后发送API响应。 如何在实用程序执行完成后等待并发送响应? 请参阅下面的代码 REST API代码:Javascript 如何在expressJs中完成实用程序执行后返回REST API响应,javascript,node.js,express,setinterval,es6-promise,Javascript,Node.js,Express,Setinterval,Es6 Promise,我已经用带有节点的expressJS编写了一个POST端点。当我调用API时,它会使用setInterval()运行一个实用程序,我希望在实用程序执行clearInterval()后发送API响应。 如何在实用程序执行完成后等待并发送响应? 请参阅下面的代码 REST API代码: const router= express.Router(); const multer= require('multer'); const {readCSVFile}= require('../util/index
const router= express.Router();
const multer= require('multer');
const {readCSVFile}= require('../util/index');
var storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads');
},
filename: (req, file, cb) => {
cb(null, file.fieldname + '-' + Date.now()+'.xlsx');
}
});
var upload = multer({storage: storage});
router.post('/fileUpload', upload.single('filename'), async (req, res) => {
readCSVFile();
res.status(201).json({id:1});
});
router.get('/',(req,res)=>{
res.sendFile(__dirname+'/index.html');
});
module.exports=router;
实用代码
const config = require('config')
const excelToJson = require('convert-excel-to-json')
const HttpsProxyAgent = require('https-proxy-agent')
const AWS = require('aws-sdk')
const json2xls = require('json2xls')
const fs = require('fs')
const awsConfig = {
httpOptions: {
agent: new HttpsProxyAgent(
config.get('aws.proxy')
),
}
}
AWS.config.credentials = new AWS.SharedIniFileCredentials({
profile: config.get('aws.profile'),
})
AWS.config.update(awsConfig)
let uuidv4 = require('uuid/v4')
let csv = [];
const lexRunTime = new AWS.LexRuntime({
region: config.get('aws.region'),
})
let refreshId
const readCSVFile = () => {
const csvSheet = excelToJson({
sourceFile: './Test.xlsx',
})
csvSheet.Sheet1.forEach(element => {
csv.push((element.A.slice(0, element.A.length)))
})
runTask()
refreshId = setInterval(runTask, 1000)
}
let botParams = {
botAlias: config.get('bot.alias'),
botName: config.get('bot.name'),
sessionAttributes: {},
}
const missedUtterancesArray = []
const matchedUtterancesArray = []
let start = 0
let end = 50
let count = 50
const runTask = () => {
let itemsProcessed = 0
console.log('executing...')
const arrayChunks = csv.slice(start, end)
arrayChunks.forEach((element) => {
botParams.inputText = element
botParams.userId = `${uuidv4()}`
lexRunTime.postText(botParams, function (err, data) {
itemsProcessed++
if (err) console.log(err, err.stack)
else {
if (data.intentName === null) {
missedUtterancesArray.push({
Utterance: element,
})
}
else{
matchedUtterancesArray.push({
Utterance: element,
})
}
}
if (itemsProcessed === arrayChunks.length) {
start = csv.indexOf(csv[end])
end = start + count
}
if (start === -1) {
let xls = json2xls(missedUtterancesArray)
fs.writeFileSync('./MissedUtterances.xlsx', xls, 'binary')
let matchedXls = json2xls(matchedUtterancesArray)
fs.writeFileSync('./MatchedUtterances.xlsx', matchedXls, 'binary')
console.log('File saved successfully!! ')
console.log('Total Matched utterances count: ',csv.length-missedUtterancesArray.length)
console.log('Total Missed utterances count: ',missedUtterancesArray.length)
console.log('Total Utterances count: ',csv.length)
clearInterval(refreshId)
}
})
})
}
我需要更多的信息来回答这个问题,但请原谅我的尝试,如果这不起作用- readCSVFile中的setInterval方法可以解释原因。作为一个异步函数,这不会停止代码进程
lexRunTime.postText看起来也是异步的。我认为你最好在回应客户时使用承诺 只有当您向我们展示相关代码时,我们才能为您提供帮助,因为答案完全取决于您的代码在做什么。有关代码的问题需要向我们展示您的代码。我在实用程序代码中没有看到任何导出。怎么装的?其中的函数是如何调用的?你如何与它沟通?您希望在休息路线中在哪里使用它?您需要在这里给我们更多的解释。请看,如果您的实用程序必须在每个或某些端点之前运行,我建议您将其作为中间件编写。