【问题标题】:node js not behaving the same way on local and Google App Egine节点 js 在本地和 Google App Engine 上的行为方式不同
【发布时间】:2022-06-13 01:33:14
【问题描述】:

我正在开发一个将 .las 文件上传到 cesium ion 的应用程序。

我修改了这段代码https://github.com/CesiumGS/cesium-ion-rest-api-examples/blob/main/tutorials/rest-api/index.js 从浏览器传递文件。

当我在本地环境中运行 npm start 时,它运行良好。

当我在 app Engine 上尝试同样的事情时,它的工作速度非常慢,而且只适用于非常小的文件。

const express = require('express');
const app = express();
const port = process.env.PORT || 3001;
const fileUpload = require("express-fileupload");
const cors = require('cors');
var path = require('path');
const AWS = require('aws-sdk');
const fs = require('fs');
const request = require('request-promise');
const rawdatafr = require('./lang/fr.json');
const rawdataen = require('./lang/en.json');
const axios = require('axios').default;
const accessToken = process.env.REACT_APP_ION_TOKEN;

const environment = process.env.NODE_ENV || 'production';

var urlLang = (environment === 'development') ? 'client/src/lang/' : 'lang/'; 
console.log('urlLang ?  '+urlLang);


app.use(cors());
app.use(fileUpload({
  useTempFiles: true,
  safeFileNames: false,
  preserveExtension: true,
  tempFileDir: 'temp/'
}));
'use strict';

var messageFromLoc = rawdataen;
var input = null;
var filename = null;
var srcType = 'POINT_CLOUD';
var message = null;
var needMonitoring = false;
var assetMetadata = null;
var finished = null;
 
function resetGlobalvar(){
    message = null;
    needMonitoring = false;
    assetMetadata = null;
    finished = null;
    input = null;
    filename = null;
    srcType = 'POINT_CLOUD';
}

async function creat_asset(){
    finished = false;
    message = 'create asset';
    axios.post('https://api.cesium.com/v1/assets', {
        name: filename,
        description: '',
        type: '3DTILES',
        options: {
            position:[ 2.29, 48.85, 0.1],
            sourceType: srcType,
        }
      },{
        headers: { Authorization: `Bearer ${accessToken}` }
      })
      .then(function (response) {
        message = 'created successfully :> send to s3';
        sendtos3(response.data);
      })
      .catch(function (error) {
        console.log(error);
        message = error;
      });
}

async function sendtos3(response){
    console.log('Asset created.');
    message = 'send to s3';
    try{
        const uploadLocation = response.uploadLocation;
        const s3 = new AWS.S3({
            apiVersion: '2006-03-01',
            region: 'us-east-1',
            signatureVersion: 'v4',
            endpoint: uploadLocation.endpoint,
            credentials: new AWS.Credentials(
                uploadLocation.accessKey,
                uploadLocation.secretAccessKey,
                uploadLocation.sessionToken)
        });

        let params =  {
            Body: fs.createReadStream(input),
            Bucket: uploadLocation.bucket,
            Key: uploadLocation.prefix+filename
        };
    
        let s3Response = await s3.upload(params).on('httpUploadProgress', function (progress) {
            message = `${messageFromLoc.upload}: ${((progress.loaded / progress.total) * 100).toFixed(2)}%`;
            console.log(`Upload: ${((progress.loaded / progress.total) * 100).toFixed(2)}%`);
        }).promise();
        // request successed
        console.log(`File uploaded to S3 at ${s3Response.Bucket} bucket. File location: ${s3Response.Location}`);
        message = `File uploaded to S3 at ${s3Response.Bucket} bucket. File location: ${s3Response.Location}`;
        step3(response);
        // return s3Response.Location; 
    }
    // request failed
    catch (ex) {
        console.error(ex);
        message = ex;
    }
}
async function step3(response){
    const onComplete = response.onComplete;
    assetMetadata = response.assetMetadata;
    message = 'step3';
    axios.post(onComplete.url, onComplete.fields,{
        headers: { Authorization: `Bearer ${accessToken}` }
      })
      .then(function (response) {
        message = 'step3 done';
        monitorTiling(assetMetadata);
      })
      .catch(function (error) {
        console.log(error);
        message = error;
      });
}

async function monitorTiling(assetMetadata){
    // console.log(response);
    const assetId = assetMetadata.id;
    message = 'monitorTiling';
    axios.get(`https://api.cesium.com/v1/assets/${assetId}`,{headers: { Authorization: `Bearer ${accessToken}` }})
        .then(function (response) {
        // handle success
        console.log('monitorTiling - success');
        var status = response.data.status;
        message = 'Tiling - success';
        if (status === 'COMPLETE') {
            console.log('Asset tiled successfully');
            console.log(`View in ion: https://cesium.com/ion/assets/${assetMetadata.id}`);
            message = 'Asset tiled successfully';
            needMonitoring = false;
            finished = true;
        } else if (status === 'DATA_ERROR') {
            console.log('ion detected a problem with the uploaded data.');
            message = 'ion detected a problem with the uploaded data.';
            needMonitoring = false;
            finished = true;
        } else if (status === 'ERROR') {
            console.log('An unknown tiling error occurred, please contact support@cesium.com.');
            message = 'An unknown tiling error occurred, please contact support@cesium.com.';
            needMonitoring = false;
            finished = true;
        } else {
            needMonitoring = true;
            if (status === 'NOT_STARTED') {
                console.log('Tiling pipeline initializing.');
                message = 'Tiling pipeline initializing.';
            } else { // IN_PROGRESS
                console.log(`Asset is ${assetMetadata.percentComplete}% complete.`);
                message = `Asset is ${assetMetadata.percentComplete}% complete.`;
            }
        }
        })
        .catch(function (error) {
        // handle error
        console.log(error);
        message =error;
        })
}
/*--------- REMOVE TEMP FILE -----------*/
function emptyTempFolder(directory, notthisfile){
    fs.readdir(directory, (err, files) => {
        if (err) throw err;
        for (const file of files) {
            console.log(file+'!='+notthisfile);
            if(file!=notthisfile){
                fs.unlink(path.join(directory, file), err => {
                    if (err) throw err;
                });
            }
        }
    });
}
/*------- LISTEN FOR CALL TO UPLOAD AND START THE UPLOAD PROCESS ----------*/
app.post("/upload", (req, res) => {
    if (!req.files) {
        res.send("File was not found");
        message = 'File was not found';
        return;
    }
    input = req.files.file.tempFilePath;
    filename = req.files.file.name;
    emptyTempFolder('temp', input.replace('temp/', ''));
    
    var ext = path.extname(filename);
    if(ext=='.zip'){
        srcType = 'CITYGML';
    }
    /*------- START UPLOAD PROCESS ----------*/
    creat_asset();
    // main().catch(e => {
    //     console.log(' main catch  '+e.message);
    //     res.send(e.message)
    // });
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})
/*------- LISTEN FOR CALL TO DELETE ASSET ----------*/
app.post("/delete", (req, res) => {
    console.log(req.body.assetId);
    deleteItem(req.body.assetId);
});
/*------- LISTEN FOR PROGRESS TO UPLOAD ASSET ----------*/
app.get("/progress", (req, res) => {
    // lang = req.get('Accept-Language').substring(0, 2).toLowerCase();
    // if(lang=='fr'){
    //     messageFromLoc = rawdatafr;
    // }
    console.log('message  ='+message);
    if(needMonitoring){
        monitorTiling(assetMetadata);
    }

    res.json({ message: message, done: finished, myAssetMetadata: assetMetadata });
    if(finished){
        resetGlobalvar();
    }
});

/*------- FUNC TO DELETE ASSET ----------*/
async function deleteItem(id) {
    urlID = 'https://api.cesium.com/v1/assets/'+id;
    const response = await request({
        url: urlID,
        method: 'DELETE',
        headers: { Authorization: `Bearer ${accessToken}` },
        json: true,
    });
}

/*--------------STATIC ----------------*/
app.use(express.static( path.join(__dirname, 'build' )));

而我的 app.yaml 是这样的:

runtime: nodejs14
env: standard
includes:
  - env_variables.yaml
instance_class: B1
service: my-app
basic_scaling:
  max_instances: 25
  idle_timeout: 60m

【问题讨论】:

  • 您肯定需要提供更多信息 - 错误消息,您使用的是 GAE 标准还是 flex,可能是您的 app.yaml,您认为错误可能来自的代码部分

标签: node.js google-app-engine cesium


猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多