Цикл for
отправляет запросы, которые асинхронно заполняют sendersArray
. Если вы console.log(sendersArray)
синхронно после запуска цикла for
, он еще не будет заполнен. Вместо цикла for
используйте .map
и Promise.all
для ожидания завершения всех запросов:
exports.getRecipientdata = (req, res) => {
const userId = req.params.recipientId;
const sendersArray = [];
Transaction.findAll({
where: {
id_recipient: userId,
},
}).then(transactions => {
return Promise.all(transactions.map(({ id_sender }) => (
User.findOne({
where: {
id: id_sender,
},
attributes: ['id', 'name', 'surname'],
include: [
{
model: Transaction,
where: { id_sender: db.Sequelize.col('user.id') },
attributes: [
'amount_money',
'date_time',
'transfer_title',
'id_recipient',
'id_sender',
],
},
],
})
.then(sender => {
sendersArray.push(sender);
})
.catch(err => {
console.log(err);
})
)));
})
.then(() => {
res.send(sendersArray);
});
};
Другая возможность, вместо push
обращения к внешней переменной, состоит в используйте массив, созданный Promise.all
, и отфильтруйте по логическим значениям, чтобы удалить значения Falsey (поскольку отсутствие возвращаемого значения catch
приведет к тому, что undefined
будет присутствовать в результате массива Promise.all
):
exports.getRecipientdata = (req, res) => {
const userId = req.params.recipientId;
Transaction.findAll({
where: {
id_recipient: userId,
},
}).then(transactions => {
return Promise.all(transactions.map(({ id_sender }) => (
User.findOne({
where: {
id: id_sender,
},
attributes: ['id', 'name', 'surname'],
include: [
{
model: Transaction,
where: { id_sender: db.Sequelize.col('user.id') },
attributes: [
'amount_money',
'date_time',
'transfer_title',
'id_recipient',
'id_sender',
],
},
],
})
.catch(err => {
console.log(err);
})
)));
})
.then((sendersArray) => {
res.send(sendersArray.filter(Boolean));
});
};
designer.cs файл обычно сохраняется автоматически, поскольку Вы вносите изменения в DBML в рамках Visual Studio. Если VS не работает при воссоздании DBML, он не может знать.
Проверьте, что.DBML файл в Visual Studio имеет набор свойств Инструмента пользователя к MSLinqToSQLGenerator. Если это не, то установлено это на это. Если это - щелчок правой кнопкой попытки по DBML после внесения изменений и выбора Run Custom Tool, чтобы видеть, обновляет ли это .designer.cs.
Можно также генерировать использование файла класса SqlMetal:
sqlmetal /code:DataContext.designer.cs /language:csharp DataContext.dbml