Skip to content

Latest commit

 

History

History
127 lines (99 loc) · 3.79 KB

26-permission.md

File metadata and controls

127 lines (99 loc) · 3.79 KB

访问权限

当有了账户功能后,可以用是否是登录状态来设置一些功能。

给 post 添加作者 id

数据库中只存储 post 的 title 和 content 两个字段,有了账户信息后,可以存储作者的 id。

// filepath: models/post.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ObjectId = Schema.ObjectId;

var PostSchema = new Schema({
    title: String,
    content: String,
    authorId: ObjectId, // 添加作者 ID。
});

const PostModel = mongoose.model('Post', PostSchema);

module.exports = PostModel;

在处理 post 请求时,将 res.locals.currentUser._id 的值存到 post 的 authorId ,这样就会把作者的 id 写入到数据库中。

// filepath: route.api.js

/* POST create post */
router.post('/posts', function (req, res, next) {
  var title = req.body.title;
  var content = req.body.content;
  
  var post = new PostModel();
  post.title = title;
  post.content = content;
  post.authorId = res.locals.currentUser._id;
  post.save(function(err, doc) {
    if (err) {
      next(err);
    } else {
      res.json({ post: doc });
    }
  });
});

限制新建 post 的处理

在 views/posts.ejs 中有一个新建文章的菜单,这里应该限制登录的用户才能创建文章。

判断 currentUser 变量是否存在,如果存在说明用户是登录状态,才显示创建菜单

// filepath: views/posts.ejs

<% if(currentUser) { %>
<!-- Split button -->
<div class="btn-group pull-right">
  <button type="button" class="btn btn-default">操作</button>
  <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    <span class="caret"></span>
    <span class="sr-only">Toggle Dropdown</span>
  </button>
  <ul class="dropdown-menu">
    <li><a href="/posts/create">新建</a></li>
  </ul>
</div>
<% } %>

显示编辑 post 的处理

一般情况下只能登录用户是文章作者才能编辑文章,所以要对编辑菜单进行判断。

判断 currentUser 存在并且 currentUser 的 id 值和 post 的作者一致才显示编辑菜单。

// filepath: views/show.ejs

  <% if(currentUser && currentUser._id.toString() === post.authorId.toString() ) { %>
  <!-- Split button -->
  <div class="btn-group pull-right">
    <button type="button" class="btn btn-default">操作</button>
    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
      <span class="caret"></span>
      <span class="sr-only">Toggle Dropdown</span>
    </button>
    <ul class="dropdown-menu">
      <li><a href="/posts/edit?id=<%= post._id %>">编辑</a></li>
    </ul>
  </div>
  <% } %>

整理配置信息(改善)

将链接 mongodb 的 url 写入到 config.js 中,这样可以更方便管理 webapp 的各种配置信息。

// filepath: config.js

module.exports = {
  cookieName: 'your_cookie_name',
  mongodbUrl: 'mongodb://localhost:32768/firstapp'
}

链接数据时只需要使用 config 的 mongodbUrl 即可

// filepath: models/init.js

var mongoose = require('mongoose');
var config = require('../config');

mongoose.connect(config.mongodbUrl, {
  useMongoClient: true
});

如果你安装mongoose的版本是>=5.x,要去掉 { useMongoClient: true },否则运行webapp时会报错:

WARNING: The useMongoClient option is no longer necessary in mongoose 5.x, please remove it.

然后换成{ useNewUrlParser: true },因为:

DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

实例

参考 first-app-sample-18