sequelize документации (http://docs.sequelizejs.com/en/v3/docs/raw-queries/) гласит:Sequelize не возвращает экземпляр модели
If you pass a model the returned data will be instances of that model.
// Callee is the model definition. This allows you to easily map a query to a predefined model
sequelize.query('SELECT * FROM projects', { model: Projects }).then(function(projects){
// Each record will now be a instance of Project
})
Я определил модель для ресурса называется agent
.
module.exports = function(sequelize, DataTypes) {
let Agent = sequelize.define('Agent', {
responseStatus: DataTypes.STRING,
agentnum: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
field : 'agentno'
},
fname : {
type: DataTypes.STRING,
allowNull : false,
field: 'fname'
},
lname : {
type: DataTypes.STRING,
allowNull: false,
field : 'lname'
},
fullname : {
type: DataTypes.STRING,
allowNull : false,
field: 'full_name'
},
status : {
type: DataTypes.STRING,
allowNull: false,
field: 'business_status'
},
loginDate: DataTypes.DATE
}, {
freezeTableName: false,
timestamps: false
});
return Agent;
};
И при вызове sequelize.query
с моим запросом и указав модель: Agent, я получаю сообщение об ошибке, брошенной из sequelize:
TypeError: this.model.bulkBuild is not a function
точки стеки в sequelize\lib\dialects\abstract\query.js:675
.
Эта ошибка сохраняется до Я применяю QueryType от sequelize.QueryTypes.RAW
. На этом этапе запрос завершается, и я получаю ответ JSON, но это не экземпляр моей модели агента. Ответ JSON от запроса sequelize содержит имена полей, к которым необходимо сопоставить.
Я импортировал свою модель (ее только одну) в соответствии с указаниями, найденными в их экспресс-образце (https://github.com/sequelize/express-example/blob/master/models/index.js). Коллекция моделей показывает, что моя модель агента включена.
import Sequelize from 'sequelize';
import config from './config';
export default callback => {
const sequelize = new Sequelize(config.database, config.username, config.password, config.params);
sequelize.sync().then(function() {
let db = { }
let agentModel = sequelize.import('model/agent.js');
db[agentModel.name] = agentModel;
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.sequelize.authenticate().then(function() {
console.log('CONNECTION OK');
});
callback(db);
}).catch(function(err) {
console.log('FAILED TO CONNECT: ', err.message);
});
}
Я хочу, чтобы запрос, чтобы вернуть экземпляр агента, когда этот запрос выполняется (вызывается из POST на мой API). Я использую MS SQL Server 2008 R2.
Любой ввод оценивается. Благодарю.
EDIT 1/30 Вот код, генерирующий объект sequelize и проходящий в модели. Коллекция модели показывает, что мой элемент добавлен, но он не имеет свойств.
connectDb: (function() {
var sequelize;
function createInstance() {
var sequelizeInstance, connectedAndAuthenticated;
sequelizeInstance = new Sequelize(config.database, config.username, config.password, config.params);
connectedAndAuthenticated = sequelizeInstance.authenticate();
connectedAndAuthenticated.sequelize = sequelizeInstance;
connectedAndAuthenticated.Sequelize = Sequelize;
var model = sequelizeInstance.import('../src/model/agent.js');
return connectedAndAuthenticated;
}
return {
getInstance : function() {
if (!sequelize) {
sequelize = createInstance();
}
return sequelize;
}
};
}())
EDIT 1/26 После манипулирования QueryTypes
, я обнаружил две вещи - что я нечаянно создал таблицу в базе данных с именем модели (Агент), и что возвращаемый объект имеет tablename
значение свойства пустое. schema
и tablename
указаны мной, но запрос, являющийся хранимой процедурой, которая объединяет несколько запросов и таблиц, напрямую не отображает объект в моей базе данных с именем Agent
. При этом документация для меня, по-видимому, предполагает, что это не имеет значения и не должно иметь значения, так как я создаю свою собственную модель, связанную с результатом запроса.
что ваш запрос? – Adam
'db.sequelize .query ( " DECLARE @response VARCHAR (256); EXEC API_Login @agentnum = N '"+ agentNum +"', @hashedPassword = '"+ password +"', @response = @response OUTPUT SELECT @response AS N'response '", {model: Agent, type: sequelize.QueryTypes.RAW}) .spread (функция (агент) { res.status (200) .json (агент); }) .catch (function (err) { handleError (err, res); }); '- Это вызванная хранимая процедура. –
что делать, если вы делаете 'type: sequelize.QueryTypes.SELECT'? – Adam