当前位置: 首页 > 工具软件 > Parse Server > 使用案例 >

parse server + express 搭建 部门 权限管理 系统

松秦斩
2023-12-01

parse server + express 搭建 部门 权限管理 系统(一). – 1021

1.基本选项

以上必需appId、masterKey、databaseURI

2.parse server 服务启动
问题1 parse未授权限:
访问 http://localhost:4040/parse

返回 {"error":"unauthorized"}

暂时不知道怎么解决,不过 parse的服务是启动了的。

问题2 dashboard 无法登录 报错 form tampered with:
parse 虽然表示没有授予权限
但是 dashboard 也还是可以进入登录页面,
但是输入账号密码后,返回的页面是
form tampered with
  • 问题解决:

  • //	dash.js
    var dashboard = new ParseDashboard({
        apps: [
            {
                appId: config.appId,
                masterKey: config.masterKey,
                appName: "☝️项目桀",
                fileKey: 'E3D35BDBFA49BD2F',
                serverURL: 'http://localhost:4040/parse',
            },
        ],
        user: {
            user: "admin",
            pass: "123qwe",
            useEncryptedPasswords: true,
            apps: [{appId: config.appId}]
        },
        // "trustProxy": 1,
        // 'useEncryptedPasswords': false,
    });
    
    //	更改内容,原dashboard.user中的 user。是。users,改成user就可以了	
    
3.parseserver 使用server搭建注册接口:
问题1 post数据和系统读取数据格式不一致:
使用MVC设计模式,暴露了model/user、router/user、没有编写 manage

注册时,发送 json 格式数据如下:
{
    "username": "admin",
    "password": "123qwe"
}  
==>>POST  http://localhost:4040/user/signup
返回
error: Parse error:  bad or missing username 
{
	"code":200,
	"stack":"Error: bad or missing username“
}
解决1:
  • 分析原因:状态码 200 表示服务已经连通,但是 没有发送数据,error表示我的数据丢失或者不对,既然我在postman已经选择body模式为json格式的raw包,那么数据还会丢失,也就意味着,我的数据传入有问题,既然有问题,那么就把body改成json格式

  • 解决

  • // 把浏览器发送过来的数据转成json
    req.body = JSON.parse(JSON.stringify(req.body));
    
  • 疑惑樂:我不可能每个接口都要写req的body转成json格式呢。

  • 后续:奇怪我明明改了postman body raw格式 json格式,去掉 上面的解决代码,现在又行了????

4.parseserver 使用server搭建用户信息获取接口:
问题1 User.get is not a function:
//	model.js
let Parse = require("parse/node");

class User extends Parse.User {
    static get schema() {
        return {
            'className': 'User',
            'fields': {
                'username': {
                    'type': 'String',
                    'required': true
                },

                'password': {
                    'type': 'String',
                    'required': true
                }
            }
        }
    }
}

Parse.Object.registerSubclass('_User',User);

module.exports = User;
//	managers/userManager.js

let Parse = require('parse/node');
let Cls = require('../model/user');

function get(Cls,target,options) {
    let query = new Parse.Query(Cls);
    if (typeof target == 'string') {
        query.equalTo('username', target);
    }else if (target.hasOwnProperty('__type')) {
        query.equalTo('username', target.username);
    }else if (target instanceof Parse.Object) {
        query.equalTo('username', target.username);
    }
    return query.first(options).then(function (result) {
       if (!result) {
           console.log('没有result');
           return errorCallback();
       }
       return result;
    });
}





module.exports = {
    get: get,
};
//	router/user.js
let express = require('express');
let router = express.Router();
let User = require('../model/user')
let Manager = require('../managers/userManager');
console.log(User);
console.log(typeof User);

router.get('/:username', function (req, res, next) {
    User.get(Manager,req.params.username,req.options).then(function (result) {
        res.status(200).json(result);
    }, function (err) {
        res.status(500).json(err);
    });
});

router.post('/signup', function (req, res, next) {
    // req.body = JSON.parse(JSON.stringify(req.body));
    var user = new Parse.User();
    user.set('username', req.body.username);
    user.set('password', req.body.password);
    console.log(req.username);
    console.log(req.body.username);
    user.save({'username': req.body.username,'password': req.body.password}).then(function(msg) {
        res.msg = msg;
        res.send(res.msg);
        return msg
    }).catch(err => {
        res.msg = err;
        res.send(res.msg);
        return err
    })
});

router.post('/signin', function (req, res, next) {

});

module.exports = router;
  • 报错内容
A ParseQuery must be constructed with a ParseObject or class name.
/* 如上报错,是我在设置参数的时候,(Cls,target,options) 
其中。Cls是一个 model的对象,上面的报错大致内容就是,要想进行ParseQuery查询,我就要给他一个 ParseObject的对象
或者一个类名。
*/
User.get is not a function
/*
而对于如上的报错呢,就是我傻傻的把User和Manager弄混淆的原因,User是一个ParseObject,Manager是一个程序逻辑,引用的一个方法。
*/
  • 最终解决
//	router.get的更改

router.get('/:username', function (req, res, next) {
    Manager.get(User,req.params.username,req.options).then(function (result) {
        res.status(200).json(result);
    }, function (err) {
        res.status(500).json(err);
    });
});
// postman get
====>>> http://localhost:4040/user/admin
====>>> 返回 
{
    "username": "admin",
    "createdAt": "2021-10-21T06:45:53.217Z",
    "updatedAt": "2021-10-21T06:45:53.217Z",
    "ACL": {
        "*": {
            "read": true
        },
        "0cOmlCGinM": {
            "read": true,
            "write": true
        }
    },
    "objectId": "0cOmlCGinM"
}
5.mongodb mongo查询数据
  • mongodb真的和mysql 不一样啊,好,我都找不到我 的数据在哪

  • //	config.js	
    module.exports = {
        "appId": "e3d35bdbfa49e2cf",
        "masterKey": "E3D35BDBFA49E2CF",
        "databaseURI": "mongodb://localhost:27017/dev",
    };
    
    //	model/user.js
    class User extends Parse.User {
        static get schema() {
            return {
                'className': 'User',
                'fields': {
                    'username': {
                        'type': 'String',
                        'required': true
                    },
    
                    'password': {
                        'type': 'String',
                        'required': true
                    }
                }
            }
        }
    }
    //	综上所述,我的mongodb是本地的mongo,数据库是dev的数据表有user
    
6. 【parse-server】 给user设置ACL。
  • 官方文档曾说:为了保证对象的安全,我们使用Parse.ACL来限制我们的每一个user,对每一个对象的读写权限。
  • 我可以使用setReadAccessandsetWriteAcecess来给Parse.ACL添加独有的权限。还可以使用setPublicReadAccesssetPublicWriteAccess一次授权所有用户
 类似资料: