我不知道为什么,但我的网络钩子在我的 cron 作业中被触发了两次。所以这个 cron 作业应该每 15 分钟运行一次,但它确实运行了两次。我将发布日志,处理程序和yml文件来提供帮助。
基本上,我的 cron 作业会向 salsify api 发出一些请求,以在 mongodb 中存储一个 url。一旦该文件完成并构建,下次 cron 作业运行时,它应该会触发 netlify 的 webhook。然后这个过程又重新开始。
在我的网络中,我注意到构建正在运行两次,并将源指向无服务器 cron 作业。
编辑:我应该在这里补充一点,即使我的cron作业运行两次,如果MongoDB中有文件,它仍然应该只在技术上调用一次webhook。然而,它仍然以某种方式调用它两次,这导致我的 netlify 构建失败,因为它需要该文件才能构建。
serverless.yml 的功能部分:
functions:
salsifyCron:
handler: src/handler.salsifyCron
events:
- schedule:
rate: cron(*/15 * * * ? *)
enabled: true
原木:
2018-05-17 10:00:41.121 (-05:00) 10d87735-59e3-11e8-be56-69e06899fa1f Trigger Webhook
2018-05-17 10:01:45.941 (-05:00) 10d87735-59e3-11e8-be56-69e06899fa1f Trigger Webhook
处理器:
require('envdotjs').load();
import fetch from 'isomorphic-fetch';
import axios from 'axios';
import middy from 'middy';
import { jsonBodyParser, httpErrorHandler, cors } from 'middy/middlewares';
import { connectToDatabase } from '../utils/db';
import Sheet from '../models/Sheet';
import config from '../utils/config';
module.exports.salsifyCron = middy(async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
let sheetId;
const options = {
url: `https://app.salsify.com/api/orgs/${
process.env.SALSIFY_ORG_ID
}/export_runs`,
headers: {
Authorization: `Bearer ${process.env.SALSIFY_API_KEY}`,
'Content-Type': 'application/json'
}
};
await connectToDatabase();
const storedData = await Sheet.find({});
if (
storedData.length > 0 &&
storedData[0] &&
storedData[0].status === 'completed' &&
storedData[0].url !== null
) {
console.log('Trigger WebHook');
axios.post('https://api.netlify.com/build_hooks/*****************');
process.exit(0);
return;
}
if (storedData[0]) {
sheetId = storedData[0].sheetId;
}
if (storedData.length === 0) {
const res = await fetch(options.url, {
method: 'POST',
headers: options.headers,
body: JSON.stringify(config)
}).then(res => res.json());
if (res.id && res.status) {
await Sheet.create({
sheetId: res.id,
url: null,
status: res.status
});
sheetId = res.id;
} else {
console.log(res);
process.exit(1);
}
}
const resWithId = await fetch(`${options.url}/${sheetId}`, {
method: 'GET',
headers: options.headers
}).then(res => res.json());
if (resWithId.status === 'running') {
console.log('running cron job');
console.log(resWithId.estimated_time_remaining);
}
if (resWithId.status === 'completed') {
console.log('completed cron job');
await Sheet.findByIdAndUpdate(
storedData[0],
{ status: resWithId.status, url: resWithId.url },
{ new: true }
);
}
})
.use(cors())
.use(jsonBodyParser())
.use(httpErrorHandler());
Lambda 超时。在您的情况下,这可能不是问题,但这是导致此结果的常见问题。
您的 lambda 不会同时执行,但会有一些延迟。这是一个线索,表明它不仅仅是获得重复执行。
我猜您的 lambda 首先因错误而终止(例如超时 - 默认 lambda 超时非常小),并且 lambda 在失败后重新运行。
我遇到了超时问题,如果您没有注意到 lambda 已超时,那就很混乱了。