zoukankan      html  css  js  c++  java
  • NodeJs将异步方法改为同步以上传文件为例

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    下面这个例子既写明如何利用 node.js 上传本地图片到服务器,又将 http 异步请求方法改为同步。

    上传图片主要借用的是 form-data 模块。

    异步变同步主要还是利用 Promise 类与 async/await 关键字相结合。

    const https = require('https');
    const fs = require('fs')
    const FormData = require('form-data')
    
    /**
     * 上传图片到图壳
     * 利用Promise和await将上传方法做成同步调用
     * @param filePath
     */
    function uploadPictureToImgKr(filePath) {
        return new Promise((resolve, reject) => {
    
            const formData = new FormData()
            formData.append('file', fs.createReadStream(filePath))
    
            const headers = formData.getHeaders()
            // 自定义请求头
            // headers.Cookie = ''
            headers['user-agent'] = 'Mozilla/5.0'
            const request = https.request({
                                              host: 'imgkr.com',
                                              method: 'POST',
                                              path: '/api/files/upload',
                                              headers: headers
                                          }, (response) => {
                if (response.statusCode !== 200) {
                    // 手动消费数据
                    response.resume();
                    reject('上传图片失败,响应码' + response.statusCode)
                    return;
                }
                let body = '';
                response.on('data', (buffer) => {
                    body += buffer;
                });
                response.on('end', () => {
                    resolve(body)
                });
            });
    
            // 关键的一步
            formData.pipe(request)
    
            request.on('error', (e) => {
                reject('problem with request: ' + e.message)
            });
        })
    }
    
    
    async function main(){
        console.log('===开始上传图片===')
        await uploadPictureToImgKr(`${__dirname}/img.jpg`).then(value => {
            try {
                console.log(JSON.parse(value))
            } catch (e) {
                console.log(value)
            }
        }).catch(reason => {
            console.log(reason)
        })
        console.log('===上传图片结束===')
    }
    
    main().then(r => console.log('===Main方法执行完毕==='))
    console.log("===JS文件执行完毕===")
    

    打印结果:

    ===开始上传图片===
    ===JS文件执行完毕===
    {
      code: 200,
      message: '请求成功',
      success: true,
      data: 'https://imgkr.cn-bj.ufileos.com/1f04bb2e-f468-46d2-b86f-dd3494193583.jpg'
    }
    ===上传图片结束===
    ===Main方法执行完毕===
    

    版权声明

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

  • 相关阅读:
    在实践中培养学生学习软件工程的兴趣
    软件工程课程设计指导随笔
    软件工程——个人总结
    软件工程第二次作业——结对编程
    个人博客作业三:微软小娜APP的案例分析
    嵌入式软件设计第12次实验报告
    嵌入式软件设计第11次实验报告
    嵌入式软件设计第09实验报告
    嵌入式软件设计第10次实验报告
    嵌入式软件设计第7次实验报告8
  • 原文地址:https://www.cnblogs.com/onblog/p/13044227.html
Copyright © 2011-2022 走看看