кодовый адресGitHub.com/MO Веб-платформа CE/О…Убедитесь, что вы хотя бы понимаете документацию яйца, прежде чем читать ее, иначе чтение следующего будет пустой тратой времени.
задание времени яйца
Во многих случаях нам нужно регулярно (или один раз) выполнять определенные скрипты, в это время мы можем использовать функцию расписания egg
как писать
schedule
- {app_root}/app/schedule.js
// 通过 schedule 属性来设置定时任务的执行间隔等配置
static get schedule() {
return {
interval: '5m', // 5 min间隔
type: 'worker', // worker 类型:每台机器上只有一个 worker 会执行这个定时任务
};
}
async subscribe() {
this.ctx.logger.info('schedule updateOa2User begin')
const res = await this.ctx.service.portal.oa.updateOa2User();
this.ctx.logger.info('schedule updateOa2User finish')
}
Настройте, какие задачи по времени запускать при запуске
В Get Schedule () Configuring Immediate: когда для параметра установлено значение True, эта задача синхронизации немедленно выполнит эту задачу синхронизации сразу после запуска приложения и состояния готовности.
app.beforeStart(async () => {
// await app.runSchedule('updateOa2User');updatePortal2User
await app.runSchedule('updatePortal2User');
});
service
- {app_root}/app/service/portal/oa.js
подключение к серверу sql
// helper.js 统一连接一个sqlserver connection
const mssql = require('mssql')
let pool = await mssql.connect(config)
// app.js 连接错误的日志
mssql.on('error', err => {
console.log('database err', err)
app.logger.error(err);
// ... error handler
})
Несколько всех асинхронных операций в async
- Например, выполнять асинхронные операции одну за другой с данными, но в итоге получить все асинхронные результаты.
Не выполняйте синхронные операции в асинхронном режиме, иначе порядок выполнения будет неожиданным! ! !
async updateUser(oaUser) {
const self = this;
let promiseAll = [];
// 设置promise对象,同步发请求
oaUser.forEach(oa => {
promiseAll.push(Promise.resolve(self.updateUserByName(oa)));
});
await Promise.all(promiseAll);
}
- {app_root}/app/service/portal/portal.js
Несколько всех асинхронных операций в async
Если вам нужно пошагово получить все данные (вот синхронизация) перед выполнением всех остальных асинхронных операций, то синхронную операцию нужно инкапсулировать в промис для поддержки асинхронных операций
async readLine(target) {
let array = [];
const self = this;
const file = await new Promise(function (resolve, reject) {
lineReader.eachLine(target, function(line, last) {
// line.split(/\s/)[0]
let data = line.split(/\s/)
if(data[2]) {
array.push({
user_id: self.ctx.helper.trim(data[0], '"'),
mail: self.ctx.helper.trim(data[1], '"'),
user_center_id: self.ctx.helper.trim(data[2], '"'),
})
}
if(last) {
resolve(array)
}
})
})
return file;
}
// 使用
const fileData = await this.readLine(target);
let promiseAll = [];
fileData.forEach(portal => {
promiseAll.push(Promise.resolve(self.updateUserByPortalId(portal)));
});
await Promise.all(promiseAll);
mysql
- заполнитель для sql
const res = await conn.query('update t_user set mail = ? where user_id = ?', [oaUser.email, user.user_id]);
- SQL-транзакция
async sqlBeginTransaction() {
const conn = await this.app.mysql.beginTransaction();
try {
const res = await conn.query('update t_user set mail = ? where user_id = ?', [oaUser.email, user.user_id]);
if(res && res.affectedRows === 1) {
await conn.commit();
} else if(res.affectedRows > 1){
// this.ctx.logger.error('')
await conn.rollback()
} else {
await conn.rollback()
}
} catch (err) {
// error, rollback
await conn.rollback(); // rollback call won't throw err
throw err;
}
}
extend
- {app_root}/app/extend/helper.js
Информация о соединении и ошибках в унифицированной упаковке Различные данные
test
- {app_root}/app/test/service/portal/portal.test.js быть улучшенным
Инструкции по модульному тестированию
config
Имейте в виду, что конфигурация окружающей среды не то же самое
Тестовый блок Config.unittest.js
зачем писать это
Исходный код анализа TODO
Расширяйте и оптимизируйте
-
Инкапсулировать чистую базу данных в сервисе в модель
-
Оптимизация очереди сообщений о задачах на основе Redis Нет необходимости запускать задачу вручную
-
Напишите egg-mssql для подключения к sqlserver