Создание простого Node-сервера с Kotlin

Я пытаюсь создать простой Node-сервер, используя Kotlin, чтобы повторить базовый пример:

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Итак, я сделал следующее:

Создал новую папку, назвал ее node

Создайте npm package с помощью npm init

Создан новый gradle project используя эту команду: gradle init --type java-library

Удалил src/main и src/test папки

Создано src/kotlin а также src/resources папки

Заменено содержание build.gradle подать по:

buildscript {
    ext.kotlin_version = '1.2.21'
    ext.node_dir = 'node'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
    }
}
apply plugin: 'kotlin2js'

repositories {     jcenter()    }

dependencies {
    def kotlinx_html_version = "0.6.8"
    compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
}

sourceSets.main {
   kotlin.srcDirs += 'src/kotlin'
   resources.srcDirs += 'src/resources'
}

compileKotlin2Js.kotlinOptions {
   outputFile = "${projectDir}/${node_dir}/index.js"
   moduleKind = "commonjs" 
   sourceMap = true
}

clean.doFirst() {
    delete("${node_dir}")
}

Установлены kotlin от npm как локальная версия: npm i kotlin Примечание: установка его глобально npm i -g kotlin не работал вообще.

Примечание: я сделал это также используя npm install или же npm i после добавления зависимостей в package.json файл, который стал похож на:

{
  "name": "kotlin-node-app",
  "version": "1.0.0",
  "description": "Node Application built with Kotlin Lang",
  "main": "index.js",
  "dependencies": {
    "kotlin": "^1.2.21"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "kotlin"
  ],
  "author": "Hasan Yousef",
  "license": "ISC"
}

Создал мой файл на src/kotlin/Main.Kt как показано ниже:

external fun require(module:String):dynamic

fun main(args: Array<String>) {
    println("Hello JavaScript!")

    val http = require("http")
    val hostname = "127.0.0.1"
    val port = 3000

    println("Server will try to run at http://${hostname}:${port}/")

    val server = http.createServer{req, res -> 
        res.statusCode = 200
        res.setHeader("Content-Type", "text/plain")
        res.end("Hello World\n")
    }

    server.listen{port, hostname ->
       println("Server running at http://${hostname}:${port}/")
    }
}

Построил проект используя gradle build и получил index.js файл создан как требуется.

После запуска файла node index.js это не работает, и выглядит приложение не читает значения port а также host по вызову server.listen,

Структура, код и вывод приложения приведены на этом снимке экрана:

index.js генерируется это:

(function (_, Kotlin) {
  'use strict';
  var println = Kotlin.kotlin.io.println_s8jyv4$;
  var Unit = Kotlin.kotlin.Unit;
  function main$lambda(req, res) {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    return res.end('Hello World\n');
  }
  function main$lambda_0(port, hostname) {
    println('Server running at http://' + hostname + ':' + port + '/');
    return Unit;
  }
  function main(args) {
    println('Hello JavaScript!');
    var http = require('http');
    var hostname = '127.0.0.1';
    var port = 3000;
    println('Server will try to run at http://127.0.0.1:3000/');
    var server = http.createServer(main$lambda);
    server.listen(main$lambda_0);
  }
  _.main_kand9s$ = main;
  main([]);
  Kotlin.defineModule('index', _);
  return _;
}(module.exports, require('kotlin')));

//# sourceMappingURL=index.js.map

1 ответ

Решение

Я только что нашел, это в вызове server.listen

Считая синтаксис "server.listen(порт, имя хоста, резерв, обратный вызов);"

В Kotlin так должно быть:

server.listen(port, hostname, fun() { 
    println("Server running at http://${hostname}:${port}/")
})

Итак, приведенный ниже код отлично работает со мной сейчас:

external fun require(module:String):dynamic

fun main(args: Array<String>) {
    println("Hello JavaScript!")

    val http = require("http")
    val hostname = "127.0.0.1"
    val port = 3000

    println("Server will try to run at http://${hostname}:${port}/")

    val server = http.createServer{req, res -> 
        res.statusCode = 200
        res.setHeader("Content-Type", "text/plain")
        res.end("Hello World\n")
    }

    server.listen(port, hostname, fun() { 
        println("Server running at http://${hostname}:${port}/")
    })

    /* OR
    server.listen(port, hostname, {
       println("Server running at http://${hostname}:${port}/") } )
    */

   /* OR
    server.listen(port, hostname) {
      println("Server running at http://${hostname}:${port}/") }
   */
}

И сгенерированный скомпилирован index.js файл:

(function (_, Kotlin) {
  'use strict';
  var println = Kotlin.kotlin.io.println_s8jyv4$;
  function main$lambda(req, res) {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    return res.end('Hello World\n');
  }
  function main$lambda_0() {
    println('Server running at http://127.0.0.1:3030/');
  }
  function main(args) {
    println('Hello JavaScript!');
    var http = require('http');
    var hostname = '127.0.0.1';
    var port = 3030;
    println('Server will try to run at http://127.0.0.1:3030/');
    var server = http.createServer(main$lambda);
    server.listen(port, hostname, main$lambda_0);
  }
  _.main_kand9s$ = main;
  main([]);
  Kotlin.defineModule('index', _);
  return _;
}(module.exports, require('kotlin')));

//# sourceMappingURL=index.js.map

Затем я запускаю это гладко, используя node node/index.js команда

Другие вопросы по тегам