node.js - 解雇并忘记控制器内的工作人员
问题描述
我需要创建一个简单的解决方案来接收用户的输入,查询我们的数据库并以任何方式返回结果,但是查询可能需要长达半小时才能运行(并且我们的云配置为在 2 分钟后超时,我不允许改变它)。
我制作了以下在本地工作的解决方案,并希望包含代码以通过电子邮件将查询结果发送给用户(以一种即发即忘的方式),但不确定如何在向用户返回 HTTP 200 时执行此操作。
index.js:
const express = require('express')
const bodyParser = require('body-parser')
const db = require('./queries')
const app = express()
const port = 3000
app.use(bodyParser.json())
app.use(
bodyParser.urlencoded({
extended: true,
})
)
app.get('/', (request, response) => {
response.json({ info: 'Node.js, Express, and Postgres API' })
})
app.post('/report', db.getReport)
app.get('/test', db.getTest)
app.listen(port, () => {
console.log(`App running on port ${port}.`)
})
查询.js:
const Pool = require('pg').Pool
const pool = new Pool({
user: 'xxx',
host: 'xx.xxx.xx.xxx',
database: 'xxxxxxxx',
password: 'xxxxxxxx',
port: xxxx,
})
const getReport = (request, response) => {
const { business_group_id, initial_date, final_date } = request.body
pool.query(` SELECT GIANT QUERY`, [business_group_id, initial_date, final_date], (error, results) => {
if (error) {
throw error
}
response.status(200).json(results.rows)
})
// I want to change that to something like:
// FireNForgetWorker(params)
// response.status(200)
}
module.exports = {
getReport
}
解决方案
通过使用回调,并基于 express 的设计,您可以发送响应并继续在同一个函数中执行操作。因此,您可以将其重组为如下所示:
const Pool = require('pg').Pool
const pool = new Pool({
user: 'xxx',
host: 'xx.xxx.xx.xxx',
database: 'xxxxxxxx',
password: 'xxxxxxxx',
port: xxxx,
})
const getReport = (request, response) => {
const { business_group_id, initial_date, final_date } = request.body
pool.query(` SELECT GIANT QUERY`, [business_group_id, initial_date, final_date], (error, results) => {
if (error) {
// TODO: Do something to handle error, or send an email that the query was unsucessfull
throw error
}
// Send the email here.
})
response.status(200).json({message: 'Process Began'});
}
module.exports = {
getReport
}
==================================================== ============================
另一种方法可能是实现一个排队系统,将这些请求推送到一个队列,并让另一个进程监听和发送电子邮件。不过那会有点复杂。
推荐阅读
- javascript - 如何在两个 HTML 页面之间向右滑动
- sql - 具有多个值和小于或大于的 IN 子句之间的性能
- firebase - Firebase 错误:“身份验证密钥无效”
- django - 在 django 中创建 json Web 令牌时如何知道要引用的表
- python - Python将列表的CSV部分转换为Pandas数据框
- laravel - laravel 地平线弹性豆茎监督有错误
- google-cloud-platform - 移动谷歌云虚拟机实例会出现错误代码“6562453592928582321”并且实例消失了
- javascript - 如何使用 DOM 和 Javascript 调用多个函数
- xamarin - Xamarin Android 共享 PDF。附件的权限被拒绝
- arrays - 如何取消设置 bash 中的所有空数组元素?