向Mongoose find添加异步方法

时间:2018-12-14 15:53:06

标签: node.js amazon-s3 mongoose mongoose-schema

我正在尝试简化获取文档文件属性并即时转换为temp S3链接的过程。通常,我一直在获取控制器中的所有文档,然后遍历并替换链接,然后再传递给视图。这可以工作,但是如果控制器逻辑很复杂,可能会有些混乱。我正在尝试为我的架构编写一个自定义方法,其中这些链接更容易替换。以下内容将打印出控制台中的链接,但由于javascript的出色异步特性,其在视图中未显示。有没有类似的方法可以使它正常工作?

也许创建一种类似于填充方法的方法?

ExampleSchema.js:

exampleSchema.methods.getS3Link = function(file_name, callback) {
    const s3 = new aws.S3();
    const s3Params = {
        Bucket: process.env.S3_BUCKET,
        Key: file_name,
        Expires: 6000
    };
    s3.getSignedUrl('getObject', s3Params, function (err, data) {
        console.log(data); //prints out the correct link
        return data; //shows undefined in view
    })
}

1 个答案:

答案 0 :(得分:0)

callback函数有一个getS3Link参数。您可以在此回调函数中传递data以便在视图中检索它。

exampleSchema.methods.getS3Link = function(file_name, callback) {
    const s3 = new aws.S3();
    const s3Params = {
        Bucket: process.env.S3_BUCKET,
        Key: file_name,
        Expires: 6000
    };
    s3.getSignedUrl('getObject', s3Params, function (err, data) {
        console.log(data); //prints out the correct link
        callback(null, data);
    })
}

更简单:

exampleSchema.methods.getS3Link = function(file_name, callback) {
    const s3 = new aws.S3();
    const s3Params = {
        Bucket: process.env.S3_BUCKET,
        Key: file_name,
        Expires: 6000
    };
    s3.getSignedUrl('getObject', s3Params, callback);
}