2015-02-06 19 views
5

Giả sử tôi có mô hình này:Cách truy cập đối tượng yêu cầu trong cuộc gọi lại vòng đời sails.js?

module.exports = { 

    attributes: { 

    title: { 
     type: 'string', 
     required: true 
    }, 

    content: { 
     type: 'string', 
     required: true 
    }, 

    createdBy: { 
     type: 'string', 
     required: true 
    } 
    } 
} 

tôi cần phải thiết lập các user id hiện tại để thuộc tính createdBy của mô hình. Tôi nghĩ rằng tôi có thể làm điều đó với callback vòng đời beforeValidate, nhưng tôi không thể truy cập đối tượng yêu cầu nơi người dùng hiện tại được lưu trữ. Có cách nào để truy cập nó không, hay tôi nên giải quyết bằng cách nào đó khác?

Tôi cố gắng này không có thành công:

beforeValidate: function (values, next) { 
    var req = this.req; // this is undefined 
    values.createdBy = req.user.id; 
    next(); 
} 

Trả lời

7

Kể từ khi yêu cầu nằm ngoài phạm vi của ORM, tôi đoán cách tiếp cận của tôi đã sai, và rằng tôi cần phải thêm dữ liệu createdBy để req.body trong một middleware. Nhưng vì điều đó không được thực hiện cho mỗi yêu cầu, tôi đoán sẽ tốt hơn nếu làm điều đó với một chính sách. Như thế này:

PostController: { 

    '*': ['passport', 'sessionAuth'], 

    create: ['passport', 'sessionAuth', 
    function (req, res, next) { 
     if (typeof req.body.createdBy === 'undefined') { 
     req.body.createdBy = req.user.id; 
     } 
     next(); 
    } 
    ] 
} 

Bằng cách này, tôi không cần ghi đè lên kế hoạch chi tiết.

+1

Tôi ngạc nhiên khi nhiều người không đề xuất điều này. Luôn thêm nó vào bộ điều khiển là một mục tiêu chống mẫu để lập kế hoạch chi tiết. Các chính sách giúp việc này trở nên dễ dàng hơn nhiều. –

+0

Ok, nhưng làm thế nào để tôi có thể truy cập vào req bên trong vòng đời gọi lại nhờ chính sách này? – pie6k

+0

Tuyệt vời! Điều này giải quyết được vấn đề của tôi! –

1

Bạn có thể làm điều đó trong hai cách.

Đầu tiên là thêm dữ liệu đó vào bộ điều khiển. Một cái gì đó như

// /api/controllers/mycontroller.js 
module.exports = { 
    new: function(req, res) { 
     if (typeof req.user.id !== 'undefined') { 
      req.body.createdBy = req.user.id;  // req.body or req.params 
     } 
     MyModel.create(req.body /* ... */) 
    } 
} 

Nếu bạn có rất nhiều thao tác dữ liệu với MyModel nó có thể gây phiền nhiễu. Vì vậy, bạn có thể thêm phương thức tĩnh vào mô hình của mình để lưu nó với id người dùng. Một cái gì đó như:

// /api/models/myModel.js 
module.exports = { 
    attributes: {/* ... */}, 

    createFromRequest: function(req, cb) { 
     // do anything you want with your request 
     // for example add user id to req.body 
     if (typeof req.user.id !== 'undefined') { 
      req.body.createdBy = req.user.id; 
     } 
     MyModel.create(req.body, cb); 
    } 
} 

Và việc sử dụng nó trong điều khiển của bạn

// /api/controllers/mycontroller.js 
module.exports = { 
    new: function(req, res) { 
     MyModel.createFromRequest(req, function(err, data) { 
      res.send(data); 
     }); 
    } 
} 
+0

Cảm ơn Glen! Tôi đã cố gắng tránh việc ghi đè các hành động kế hoạch chi tiết. Nhưng tôi không biết nếu tốt nhất. Nhìn vào câu trả lời của riêng tôi, điều đó có hợp lý không? –

+1

@MartinSchaer, tôi sẽ không sử dụng nó cho dự án thực. Lý do đầu tiên, đó là không rõ ràng để sử dụng các chính sách theo cách như vậy. Tôi có nghĩa là nếu tôi có dự án và biết rằng một nơi nào đó id người dùng được thêm vào để yêu cầu nội dung trước khi nó lưu, chính sách là nơi cuối cùng mà tôi sẽ cố gắng tìm nó. Lý do thứ hai là khó sử dụng lại mã này. Nếu bạn muốn thêm id người dùng vào các phương thức khác của mô hình, bạn nên viết lại hàm này (hoặc tạo chính sách đơn để thêm id người dùng). Đây là ý kiến ​​của tôi, nhưng tôi tin rằng chính sách nên được sử dụng để thao tác truy cập và các mô hình nên được sử dụng cho thao tác dữ liệu. –

-2

Sails có mục đích không hiển thị các đối tượng reqres đối với các cuộc gọi lại vòng đời, có nghĩa là bạn không nên làm những gì bạn đang cố gắng làm.

Nếu bạn đang cố gắng đặt id người dùng, bạn có thể thêm id đó vào đối tượng req.query bên trong chính sách về cánh buồm; sau đó nếu bạn chỉ sử dụng điểm cuối REST tiêu chuẩn, id sẽ được tự động thêm vào mô hình. Mô-đun sails-auth của tôi thực hiện tương tự.

+0

Yea. Nhưng nếu tôi muốn thêm một theo dõi lịch sử cho đối tượng. Và không viết phần lịch sử mỗi lần nam (như cập nhật một đối tượng mà "người dùng" đã thay đổi thuộc tính "màu") Và điều duy nhất tôi muốn là thêm người dùng đã đăng nhập hiện tại vào đối tượng sau khi cập nhật nó. Ngay cả khi truy vấn url hiện tại được sử dụng cho cuộc gọi hiện tại cũng sẽ tốt. –

Các vấn đề liên quan