В моем приложении у меня есть несколько маршрутов, настроенных через Express, которые вызываются при первой загрузке приложения в браузере и которые вызываются снова при определенных пользовательских событиях.
Эти маршруты работают при тестировании на моем локальном компьютере, а также в Google App Engine Web Preview, но не работают в производственной среде.
Для рассматриваемых маршрутов ответ сервера представляет собой массив JSON файлов в папке на сервере.Моя функция JS на стороне браузера listUserFiles
затем запрашивает список файлов в каталоге userfiles
и заполняет настраиваемое диалоговое окно с именами файлов.
Что я получаю в работе, так это то, что HTTPзапрос внутри этой точно такой же функции, вместо того, чтобы отвечать списком файлов в каталоге userfiles
, отвечает HTML-кодом моего файла index.html, а затем выдает ошибки, когда JSON.parse()
не может понять это.
Я подозреваю, что это может быть связано с тем, как я настроил мой файл app.yaml для производственной среды, но я новичок в Google App Engine, файлах конфигурации yaml и производственном приложении.развертывание в целом, и ходили кругами в течение нескольких дней с доступной документацией.
Вот код, который я считаю уместным:
Со стороны сервера routes.js
const express = require('express');
const router = express.Router();
const jsonMethods = require('./js/jsonMethods');
const htmlMethods = require('./js/htmlMethods');
const qs = require('querystring');
const fileUpload = require('express-fileupload');
const bodyParser = require("body-parser");
//Middle ware that is specific to this router
router.use(function timeLog(req, res, next) {
console.log('Time: ', Date.now());
next();
});
//router.use( bodyParser.json() );
router.use( bodyParser.urlencoded({
extended: true
}));
router.use(fileUpload( { limits: { fileSize: 5 * 1e6 } } ));
router.get('/listUserFiles' ,
function( req, res ) {
var userfiles = jsonMethods.listFilesInDir( (__dirname + '/userfiles'), res );
res.send();
}
);
Мой файл app.yaml:
runtime: nodejs10
instance_class: F2
env_variables:
BUCKET_NAME: "example-gcs-bucket"
handlers:
- url: /assets
static_dir: assets
- url: /css
static_dir: css
- url: /userHelpDocs
static_dir: userHelpDocs
- url: /userImages
static_dir: userImages
- url: /userfiles
static_dir: userfiles
- url: /listUserfiles
static_dir: listUserfiles
- url: /themes
static_dir: themes
- url: /lucidNodes-addons
static_dir: lucidNodes-addons
- url: /contextMenu
static_dir: contextMenu
- url: /lucidNodes-modules
static_dir: lucidNodes-modules
- url: /js
static_dir: js
- url: /libs
static_dir: libs
- url: /css
static_dir: css
- url: /(.*\.(html|js))$
static_files: \1
upload: (.*\.(html|js))$
- url: /.*
static_files: index.html
upload: index.html
secure: always
... и функция из js на стороне браузера, которая обрабатывает запрос и ответ:
/* USERFILE DIRECTORY LISTING */
var userfiles;
function listUserFiles( domElementId = 'loadFile-panel-area', routeURL = "/listUserFiles", folderURL = "/userfiles" ){
var httpRequest = new XMLHttpRequest();
console.log( "listUserFiles(): ", httpRequest );
// Send the request
httpRequest.open( "GET", routeURL, true );
httpRequest.send();
httpRequest.onreadystatechange = function() {
if ( this.readyState === 4 && this.status == 200 ){
userfiles = JSON.parse( this.responseText );
listFileLinks( folderURL, userfiles, document.getElementById( domElementId ) );
}
else if( this.readyState === 4 && this.status !== 200 ){
console.error( this.status.toString() + ": UserFiles Folder " + folderURL + " not found!" );
}
}
}
...
Итак, я бы хотел, чтобы функция listUserFiles
работала какэто происходит в тестировании и на моей локальной машине ... получение массива имен файлов из папки при вызове экспресс-маршрута.
Заранее спасибо за вашу помощь.