Keystonejs: ошибка при обновлении профиля пользователя;имя, адрес электронной почты, пароль и т. д. - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в Keystone JS.Прямо сейчас я делаю веб-приложение, которое имеет панель пользователя.Я пытаюсь использовать метод updateItem для пользовательского элемента, который уже был проиндексирован / найден / запрошен в первом параметре функции.

// KEYSTONE METHOD
User.updateItem({_id: req.params.id}, req.body, {
    fields: 'user',
    flashErrors: true,
    logErrors: true},
function(err) {
    if (err) {
        console.log("An error happened!");
        console.log(err);
    } else {
        return res.redirect('/dashboard/' + req.params.id);
    }
    next();
});

Ошибка, появившаяся в консоли, показывает:

{
 error: 'invalid configuration',
 detail: 'Invalid path specified in fields to update [user] for list User'
}

Кажется, он не нашел модель пользователя.Я хотел console.log, если система нашла пользовательскую модель по параметрам обратного вызова, но у этого метода ее нет.

Как я уже сказал, я действительно новичок в keystonejs и даже не близкочтобы понять это полностью о том, как все на самом деле работает здесь.Но я чувствую, что это действительно близко к работе ...

** КОД REF: Виды панели инструментов **

var keystone = require('keystone');
var user     = keystone.list("User");
var User     = keystone.List("User");

exports = module.exports = function (req, res) {
var view = new keystone.View(req, res);
var locals = res.locals;

// Init locals
locals.currentUser = req.body || {};

view.query('currentUser', user.model.findById(req.params.id));

view.on('post', { action: 'user.update' }, function(next) {

    // KEYSTONE METHOD
    User.updateItem({_id: req.params.id}, req.body, {
        fields: 'user',
        flashErrors: true,
        logErrors: true},
    function(err) {
        if (err) {
            console.log("An error happened!");
            console.log(err);
        } else {
            return res.redirect('/dashboard/' + req.params.id);
        }
        next();
    });
});

// Render the view
view.render('../dashboard/dashboard-main');

};

** КОД REF:Нефритовый код **

form(method="post")
    input(type='hidden', name='action',  value='user.update')

        .row.mb-4
            .col-md-4
                label First Name
                input.form-control(type="text" name="first" value=currentUser.name.first)

            .col-md-4
                label Last Name
                input.form-control(type="text" name="last" value=currentUser.name.last)

            .row.mb-10
                .col-md-12
                    button.btn.btn-primary(type="submit")
                        i.fa.fa-fw.fa-lg.fa-check-circle
                        |  Save

Вот модель пользователя:

var keystone = require('keystone');
var Types = keystone.Field.Types;

/**
 * User Model
 * ==========
 */
var User = new keystone.List('User');

User.add({
    name: { type: Types.Name, required: true, index: true },
    email: { type: Types.Email, initial: true, required: true, unique: true, index: true },
    password: { type: Types.Password, initial: true, required: true },
}, 'Permissions', {
    isAdmin: { type: Boolean, label: 'Can access Keystone', index: true },
});

// Provide access to Keystone
User.schema.virtual('canAccessKeystone').get(function () {
    return this.isAdmin;
});


/**
 * Relationships
 */
User.relationship({ ref: 'Post', path: 'posts', refPath: 'author' });


/**
 * Registration
 */
User.defaultColumns = 'name, email, isAdmin';
User.register();

Примечание. Я использовал генератор yeoman для этого приложения, только что добавил новый файл маршрута и файл вида нефритадля панели пользователя.

1 Ответ

0 голосов
/ 10 октября 2018
var User = keystone.List("User");

недопустимо в вашем представлении / route.js.Вы используете заглавные буквы .List только тогда, когда создаете новый List в своей модели, так как это инициация класса, как у вас в вашей модели.

Поэтому правильный контекст для вашей панели мониторинга, скорее всего, будет:

var keystone = require('keystone');
var user     = keystone.list("User");
/* var User     = keystone.List("User"); */

exports = module.exports = function (req, res) {
var view = new keystone.View(req, res);
var locals = res.locals;

// Init locals
locals.currentUser = req.body || {};

view.query('currentUser', user.model.findById(req.params.id));

view.on('post', { action: 'user.update' }, function(next) {

    // KEYSTONE 
    /* User.updateItem({_id: req.params.id}, req.body, { */
    user.updateItem({_id: req.params.id}, req.body, {
        fields: 'user',
        flashErrors: true,
        logErrors: true},
    function(err) {
        if (err) {
            console.log("An error happened!");
            console.log(err);
        } else {
            return res.redirect('/dashboard/' + req.params.id);
        }
        next();
    });
});

// Render the view
view.render('../dashboard/dashboard-main');
...