Добавление асинхронного метода в Mongoose Find - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь упростить процесс получения атрибута файла документов и преобразования на временную ссылку 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 голосов
/ 20 декабря 2018

Для функции getS3Link есть аргумент callback.Вы можете передать 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);
}
...