2015-04-08 2 views
3

Я пытаюсь проверить, существует ли внешний ключ. Я хочу создать объект только в том случае, если внешний ключ действителен.Как обрабатывать ошибку в beforeCreate?

Я запрашиваю объект в beforeCreate, но когда я вызываю обратный вызов с сообщением об ошибке, ошибка не обрабатывается (traceback) и возвращается 500.

Я хотел бы обработать ошибку изящно и вернуть код состояния 400 (Bad Request).

beforeCreate: function(values, next) { 
    // Verify that the brand id is valid 
    Brand.findOne(values.brand, function(err, brand){ 
     if (err || !brand){ 
     return next({"error": "Brand does not exist."}); 
     } 
     return next(); 
    }); 
    } 
+0

Возможно, вам нужно вернуть значение, чтобы оно было правдивым. 'return next (true)' или 'return next (brand)'. –

+1

Да, в настоящее время все ошибки в обратных вызовах жизненного цикла возвращают 500. Идем дальше и записываем эту функцию в репозиторий github –

+0

Но ошибка не обрабатывается, так как есть трассировка. – Siecje

ответ

1

Я не уверен, но что произойдет, если вы делаете:

return next(new Error("Brand does not exist.")); 
+0

Еще 500 ошибок с трассировкой. – Siecje

+1

Любые новости о том, как вернуть 400 внутри обратного вызова beforeCreate ?. –

0

Я решил это так:

Создать Sails служба ModelError.js

module.exports = function(message, code) { 
    var err = new Error(); 
    err.name = 'Validation'; 
    err.code = (code ? code : 400); 
    err.invalidAttributes = {}; 
    err.message = message; 

    return err; 
}; 

В модели beforeCreate

beforeCreate: function(record, cb) { 
    if (found) return cb(ModelError('message error!!!!!!!!', 400)); 
    return cb(); 
} 

И подписаться ответ/negotiate.js

module.exports = function negotiate(data) { 
    // Get access to `req`, `res`, & `sails` 
    var req = this.req; 
    var res = this.res; 
    var sails = req._sails; 

    // Set status code 
    res.status((data.code ? data.code : 400)); 

    // Log error to console 
    if (data !== undefined) { 
    sails.log.verbose('Sending negotiate response: \n',data); 
    } 
    else sails.log.verbose('Sending negotiate response'); 
    // console.log(data.Errors) 
    if(data.Errors) return res.jsonx({errors: data.Errors}); 
    if(data.message) return res.jsonx(data.message) 
    return res.jsonx(data) 
}; 

Любая ошибка автоматически вызывается парусами падает в negotiate.js, так просто лечить то же самое, чтобы вернуть код ошибки на основе data.code.