NodeJS Express — «Синтаксис: недопустимый или неожиданный токен», когда требуется jpg

#node.js #express

#node.js #выразить

Вопрос:

Я сталкиваюсь с проблемой, когда я пытаюсь запросить изображение в формате .jpg. При поиске в Google я думал, что это как-то связано с Jest, но теперь, когда я начинаю с чистого проекта, не имеющего Jest в качестве зависимости, я получаю ту же ошибку.

В чем может быть проблема?

Это файлы, которые я пытаюсь запустить

server.js

 // Import express framework
const express = require('express')
// Import routes
const visionAiRouter = require('./routes/vision-ai-route')
// Setup default port
const PORT = process.env.PORT || 4000
// Create express app
const app = express()
// Vision AI Route
app.use('/ai', visionAiRouter)

// Implement route for errors
app.use((err, req, res, next) => {
 console.error(err.stack)
 res.status(500).send('Something broke!')
})
// Start express app
app.listen(PORT, function() {
console.log(`Server is running on: ${PORT}`)
})
  

vision-ai-route.js

 // Import
const express = require('express')
const visionAi = require('../controllers/vision-ai-controller')
// Create express router
const router = express.Router()
router.get('/', visionAi.labelDetection)
// Export
module.exports = router
  

vision-ai-controller.js

 // Assets
const cat = require('./../data/cat.jpg')
// Create controller for GET request to '/users/all'
exports.labelDetection = async (req, res) => {
      // Imports the Google Cloud client library
      const vision = require('@google-cloud/vision');
  
      // Creates a client
      const client = new vision.ImageAnnotatorClient();
    
      // Performs label detection on the image file
      const [result] = await client.labelDetection(cat);
      const labels = result.labelAnnotations;
      const stringify = JSON.stringify(labels);
      await res.json(stringify)
}
  

package.json

 {
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "dependencies": {
    "@google-cloud/vision": "^2.1.1",
    "express": "^4.17.1",
    "nodemon": "^2.0.4"
  },
  "devDependencies": {},
  "scripts": {
    "start": "nodemon server.js"
  },
  "author": "",
  "license": "ISC"
}
  

Трассировка стека

 /Users/kod/Desktop/Code/Private/vision-ai/test/data/cat.jpg:1
����
^    
SyntaxError: Invalid or unexpected token
       at Module._compile (internal/modules/cjs/loader.js:721:23)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
        at Module.load (internal/modules/cjs/loader.js:653:32)
        at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
        at Function.Module._load (internal/modules/cjs/loader.js:585:3)
        at Module.require (internal/modules/cjs/loader.js:690:17)
        at require (internal/modules/cjs/helpers.js:25:18)
        at Object.<anonymous> (/Users/kod/Desktop/Code/Private/vision-ai/test/controllers/vision-ai-controller.js:3:13)
        at Module._compile (internal/modules/cjs/loader.js:776:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
  

Комментарии:

1. Как вы можете использовать require? для файлов? вы должны указать полный путь к вашему файлу изображения. Может быть, как в папке images, вы можете разместить изображения и сделать папку images общедоступной. Спасибо

2. Я пытаюсь скомпилировать свой мозг в NodeJS из React и думаю, что все работает как React 😉 @paulsm4 Итак, в NodeJS вам всегда нужно записывать полный путь к файлу, и это не работает как React, где вы можете записать путь к файлу, относительный к файлу, который вы редактируете?

3. Как вы уже поняли, проблема не имеет ничего общего с путем … просто «require ()» не означает то, что вы, по-видимому, думали, что это так 🙂

Ответ №1:

Вам не может потребоваться файл без кода, поскольку require он предназначен для загрузки исполняемого кода. Правильным эквивалентом было бы const cat = fs.readFileSync('./test/data/cat.jpg') .

Комментарии:

1. Спасибо за разъяснение! Это сработало! Просто добавлю, что мне также пришлось отредактировать путь к файлу (на основе комментариев к моему сообщению).

2. Путь на самом деле относится к PWD приложения, так что вы, вероятно, сможете передать ./test/data/cat.jpg , но чтобы быть однозначным, вы можете использовать path.join(__dirname, '../test/data/cat.jpg') . __dirname Глобальный доступен во всех Node.js модулирует и преобразует в каталог, в котором находится текущий файл.