Node.js Keystonejs:更新用户时出错';s剖面图;姓名、电子邮件、通行证等

Node.js Keystonejs:更新用户时出错';s剖面图;姓名、电子邮件、通行证等,node.js,express,content-management-system,dashboard,keystonejs,Node.js,Express,Content Management System,Dashboard,Keystonejs,我是keystone js的新手。现在我正在制作一个带有用户仪表板的web应用程序。我正在尝试对用户项使用updateItem方法,该用户项已经在函数的第一个参数中被索引/搜索/查询 // KEYSTONE METHOD User.updateItem({_id: req.params.id}, req.body, { fields: 'user', flashErrors: true, logErrors: true}, function(err) { if (

我是keystone js的新手。现在我正在制作一个带有用户仪表板的web应用程序。我正在尝试对用户项使用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非常陌生,我甚至还没有完全了解它在这里的工作原理。 但是,我觉得离工作很近了

**代码参考:仪表板视图**

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');
})

**代码参考:翡翠代码**

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 generator,并为用户仪表板添加了新的路由文件和jade视图文件

var User = keystone.List("User");
在您的视图/route.js中无效。只有在模型中创建新列表时才使用大写的.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');
在您的视图/route.js中无效。只有在模型中创建新列表时才使用大写的.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');

var user=keystone.list(“用户”);var User=keystone.List(“用户”);我对这些行进行了实验,结果非常不同,我console.log使用了它们的功能,它们不同,未大写的似乎更适合访问mongoose方法,而大写的似乎更适合建模方法,它们的文档在这种情况下是如此的无用,一切都是如此的混乱。查询工作正常,因为我可以将本地currentUser(变量)发送到pug文件。updateItem方法也可以工作,但它似乎没有与User.js模型文件同步……忘记了使用User.model.updateItem的建议。试过了,User.model.updateItem和User.model.updateItem都不起作用…根据你的建议,又出现了一个问题。发生了一个错误!{错误:'无效配置',详细信息:'为列表用户'}更新[user]的字段中指定的路径无效。编辑updateItem中的字段;字段:“用户”=>字段:“名称”。然后显示TypeError:item.get不是函数,然后使应用程序崩溃。很抱歉,这太麻烦了…顺便说一句,如果您有其他方法/您的方法来编辑/更新用户信息,包括使用keystone的方法更新密码,我将非常感激。。。感谢基本用户字段;姓名、电子邮件、密码和其他更多的用户字段;网站,推特链接,fb链接,以及更多。与其他人(mongoose C.R.U.D.s)没有任何问题,但只能使用keystone来设置非常基本的密码。在此之前,我对keystone没有任何经验,仅供参考。。。或者我应该使用updateHandler()?var user=keystone.list(“用户”);var User=keystone.List(“用户”);我对这些行进行了实验,结果非常不同,我console.log使用了它们的功能,它们不同,未大写的似乎更适合访问mongoose方法,而大写的似乎更适合建模方法,它们的文档在这种情况下是如此的无用,一切都是如此的混乱。查询工作正常,因为我可以将本地currentUser(变量)发送到pug文件。updateItem方法也可以工作,但它似乎没有与User.js模型文件同步……忘记了使用User.model.updateItem的建议。试过了,User.model.updateItem和User.model.updateItem都不起作用…根据你的建议,又出现了一个问题。发生了一个错误!{错误:'无效配置',详细信息:'为列表用户'}更新[user]的字段中指定的路径无效。编辑updateItem中的字段;字段:“用户”=>字段:“名称”。然后显示TypeError:item.get不是函数,然后使应用程序崩溃。很抱歉,这太麻烦了…顺便说一句,如果您有其他方法/您的方法来编辑/更新用户信息,包括使用keystone的方法更新密码,我将非常感激。。。感谢基本用户字段;姓名、电子邮件、密码和其他更多的用户字段;网站,推特链接,fb链接,以及更多。与其他人(mongoose C.R.U.D.s)没有任何问题,但只能使用keystone来设置非常基本的密码。在此之前,我对keystone没有任何经验,仅供参考。。。还是应该使用updateHandler()?